Back to TILs

C++ yaml_01

Date: 2020-10-19Last modified: 2023-04-05

Table of contents

  YAML::Node config;

  // Vai salvar na ordem de criação
  config["key2"] = 2;
  config["key3"] = 3.141592;
  config["key1"] = "value1";

  config["sequence1"].push_back(30);
  config["sequence1"].push_back(20);
  config["sequence1"].push_back(10);
  config["sequence1"].push_back("string");
  config["sequence1"].push_back(50);

  if (config["sequence1"].IsSequence()) {
    cout << "sequence1 é uma sequência" << endl;
  }

  if (config["key1"].IsScalar()) {
    cout << "key1 é um escalar" << endl;
  }

  if (config.IsMap()) {
    cout << "config é um mapa" << endl;
  }

  config["aliaskey"] = config["key1"];

  ofstream out("config.yaml");
  out << config;
  out.close();

  // ----------------------------------------------------------------------
  //
  // ----------------------------------------------------------------------

  YAML::Node config2 = YAML::LoadFile("config.yaml");

  if (config2["key1"] and config2["key2"] and config2["key3"]) {
    cout << "key1: " << config2["key1"].as<string>() << endl;
    cout << "key2: " << config2["key2"].as<int>() << endl;
    cout << "key3: " << config2["key3"].as<float>() << endl;
  }

  if (config2["sequence1"] && config2["sequence1"].IsSequence()) {
    // para fazer o swap não usar alias
    auto tmp = config2["sequence1"][0].as<int>();
    config2["sequence1"][0] = config2["sequence1"][2].as<int>();
    config2["sequence1"][2] = tmp;
    cout << "[2]: " << config2["sequence1"][2] << endl;

    for (auto item : config2["sequence1"]) {
      cout << "Sequence1 default: " << item << endl;
      try {
        cout << "Sequence1 string: " << item.as<string>() << endl;
        cout << "Sequence1 int: " << item.as<int>() << endl;
      } catch (YAML::BadConversion &e) {
        cout << "exceção de conversão: " << e.what()
             << endl;  // deve ser disparada quando tentar converter "string" em
                       // int
      } catch (YAML::Exception &e) {
        cout << "exceção genérica: " << e.what() << endl;
      } catch (...) {
        cout << "N exceção: falha de conversão" << endl;
      }
    }
  }

  if (config2["not-found-key"]) {
    cout << "Key não encontrada foi encontrada!" << endl;
  }

Possible output

sequence1 é uma sequência
key1 é um escalar
config é um mapa
key1: value1
key2: 2
key3: 3.14159
[2]: 30
Sequence1 default: 10
Sequence1 string: 10
Sequence1 int: 10
Sequence1 default: 20
Sequence1 string: 20
Sequence1 int: 20
Sequence1 default: 30
Sequence1 string: 30
Sequence1 int: 30
Sequence1 default: string
Sequence1 string: string
Sequence1 int: exceção de conversão: yaml-cpp: error at line 8, column 5: bad conversion
Sequence1 default: 50
Sequence1 string: 50
Sequence1 int: 50

References