Program Listing for File yaml_helpers.h

Return to documentation for file (include/mola_yaml/yaml_helpers.h)

/* -------------------------------------------------------------------------
 *   A Modular Optimization framework for Localization and mApping  (MOLA)
 * Copyright (C) 2018-2025 Jose Luis Blanco, University of Almeria
 * See LICENSE for license information.
 * ------------------------------------------------------------------------- */
#pragma once

#include <mola_yaml/macro_helpers.h>
#include <mrpt/containers/yaml.h>

#include <map>
#include <string>

namespace mola
{
struct YAMLParseOptions
{
  bool doIncludes{true};
  bool doCmdRuns{true};
  bool doEnvVars{true};

  std::map<std::string, std::string> variables;

  std::string includesBasePath;
};

[[nodiscard]] std::string parse_yaml(
    const std::string& text, const YAMLParseOptions& opts = YAMLParseOptions());

[[nodiscard]] mrpt::containers::yaml parse_yaml(
    const mrpt::containers::yaml& input, const YAMLParseOptions& opts = YAMLParseOptions());

[[nodiscard]] mrpt::containers::yaml load_yaml_file(
    const std::string& fileName, const YAMLParseOptions& opts = YAMLParseOptions());

[[nodiscard]] std::string yaml_to_string(const mrpt::containers::yaml& cfg);

#define ENSURE_YAML_ENTRY_EXISTS(_c, _name) \
  ASSERTMSG_(                               \
      _c.has(_name),                        \
      mrpt::format("Missing YAML required entry: `%s`", std::string(_name).c_str()))

#define YAML_LOAD_OPT3(_param_str, _varname, _type) \
  _param_str._varname = cfg.getOrDefault<_type>(#_varname, _param_str._varname)

#define YAML_LOAD_OPT2(_varname, _type) _varname = cfg.getOrDefault<_type>(#_varname, _varname)

#define YAML_LOAD_OPT_DEG2(_varname, _type) \
  _varname = mrpt::DEG2RAD(cfg.getOrDefault<_type>(#_varname, mrpt::RAD2DEG(_varname)))

#define YAML_LOAD_MEMBER_OPT(_varname, _type) \
  _varname##_ = cfg.getOrDefault<_type>(#_varname, _varname##_)

#define YAML_LOAD_REQ3(_param_str, _varname, _type) \
  ENSURE_YAML_ENTRY_EXISTS(cfg, #_varname);         \
  YAML_LOAD_OPT3(_param_str, _varname, _type)

#define YAML_LOAD_REQ2(_varname, _type)     \
  ENSURE_YAML_ENTRY_EXISTS(cfg, #_varname); \
  YAML_LOAD_OPT2(_varname, _type)

#define YAML_LOAD_REQ_DEG2(_varname, _type) \
  ENSURE_YAML_ENTRY_EXISTS(cfg, #_varname); \
  YAML_LOAD_OPT_DEG2(_varname, _type)

#define YAML_LOAD_MEMBER_REQ(_varname, _type) \
  ENSURE_YAML_ENTRY_EXISTS(cfg, #_varname);   \
  YAML_LOAD_MEMBER_OPT(_varname, _type)

#define YAML_LOAD_OPT_DEG3(_param_str, _varname, _type)     \
  _param_str._varname = mrpt::RAD2DEG(_param_str._varname); \
  YAML_LOAD_OPT3(_param_str, _varname, _type);              \
  _param_str._varname = mrpt::DEG2RAD(_param_str._varname)

#define YAML_LOAD_REQ_DEG3(_param_str, _varname, _type)     \
  _param_str._varname = mrpt::RAD2DEG(_param_str._varname); \
  YAML_LOAD_REQ(_param_str, _varname, _type);               \
  _param_str._varname = mrpt::DEG2RAD(_param_str._varname)

#define YAML_LOAD_OPT(...) VFUNC(YAML_LOAD_OPT, __VA_ARGS__)
#define YAML_LOAD_REQ(...) VFUNC(YAML_LOAD_REQ, __VA_ARGS__)
#define YAML_LOAD_OPT_DEG(...) VFUNC(YAML_LOAD_OPT_DEG, __VA_ARGS__)
#define YAML_LOAD_REQ_DEG(...) VFUNC(YAML_LOAD_REQ_DEG, __VA_ARGS__)

}  // namespace mola