Program Listing for File config.h

Return to documentation for file (core/config.h)

#pragma once

#include <yaml-cpp/yaml.h>

#include <magic_enum/magic_enum.hpp>
#include <nlohmann/json.hpp>
#include <string>

#include "lupnt/core/definitions.h"

namespace lupnt {

  // Config loading and management functions
  void AddConfigSearchDir(const std::string& dir);
  void InitDefaultConfigSearchDirs();

  Config LoadConfig(const std::string& yaml_path, const std::string& key = "",
                    bool recursive = true);
  Config LoadConfig(const Config& config);

  void SaveConfig(const Config& config, const std::string& path);

  std::string ConfigToString(const Config& config);

  json ConfigToJson(const Config& config);
  Config JsonToConfig(const json& json);

  // Reads an enum value from a YAML node, accepting either an integer or a string.
  // Throws if both conversions fail.
  template <typename T> T ReadEnum(const YAML::Node& node) {
    try {
      // Try to read as int (numeric enum value)
      return enum_value<T>(node.as<int>());
    } catch (const YAML::BadConversion&) {
      // Otherwise try string
      auto result = enum_cast<T>(node.as<std::string>());
      if (result.has_value())
        return result.value();
      else
        throw YAML::BadConversion(node.Mark());
    }
  }

}  // namespace lupnt