The YamlObject class is now a generic data container to model trees of values. Rename it to ValueNode and expand the class documentation. While at it, drop the unneeded libcamera:: namespace prefix when using the ValueNode class. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
63 lines
1.4 KiB
C++
63 lines
1.4 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2024-2025 Red Hat, inc.
|
|
*
|
|
* Global configuration handling
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <filesystem>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
#include <libcamera/base/utils.h>
|
|
|
|
#include "libcamera/internal/value_node.h"
|
|
|
|
namespace libcamera {
|
|
|
|
class GlobalConfiguration
|
|
{
|
|
public:
|
|
using Configuration = const ValueNode &;
|
|
|
|
GlobalConfiguration();
|
|
|
|
unsigned int version() const;
|
|
Configuration configuration() const;
|
|
|
|
template<typename T>
|
|
std::optional<T> option(
|
|
const std::initializer_list<std::string_view> confPath) const
|
|
{
|
|
const ValueNode *c = &configuration();
|
|
for (auto part : confPath) {
|
|
c = &(*c)[part];
|
|
if (!*c)
|
|
return {};
|
|
}
|
|
return c->get<T>();
|
|
}
|
|
|
|
std::optional<std::vector<std::string>> listOption(
|
|
const std::initializer_list<std::string_view> confPath) const;
|
|
std::optional<std::string> envOption(
|
|
const char *const envVariable,
|
|
const std::initializer_list<std::string_view> confPath) const;
|
|
std::optional<std::vector<std::string>> envListOption(
|
|
const char *const envVariable,
|
|
const std::initializer_list<std::string_view> confPath,
|
|
const std::string delimiter = ":") const;
|
|
|
|
private:
|
|
bool loadFile(const std::filesystem::path &fileName);
|
|
void load();
|
|
|
|
std::unique_ptr<ValueNode> yamlConfiguration_ =
|
|
std::make_unique<ValueNode>();
|
|
};
|
|
|
|
} /* namespace libcamera */
|