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-2024 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 <sstream>
#include <string>

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

    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