Trabalhando com YAML em C++: bibliotecas yaml-cpp e rapidyaml
YAML (YAML Ain't Markup Language) é um formato de serialização de dados amplamente utilizado para arquivos de configuração, arquivos de descrição de ambiente (Docker Compose, Kubernetes), bem como para troca de dados entre serviços. Ao contrário do JSON, o YAML é mais legível para humanos devido à indentação e ao suporte a comentários.
Em C++ não há suporte nativo a YAML, mas existem excelentes bibliotecas de terceiros. Neste artigo, abordaremos as duas mais populares: yaml-cpp (clássica, simples) e rapidyaml (moderna, muito rápida). Você aprenderá como instalar as bibliotecas, ler um arquivo YAML, criá-lo programaticamente e tratar erros típicos.
1. Biblioteca yaml-cpp
yaml-cpp é a biblioteca padrão de facto para trabalhar com YAML em C++. Ela fornece uma API conveniente, que lembra o trabalho com contêineres STL. A biblioteca suporta a especificação YAML 1.2.
Instalação
A maneira mais simples é usar o gerenciador de pacotes vcpkg ou Conan. Para Linux/macOS:
# Instalação via vcpkgvcpkg install yaml-cpp
# Instalação via Conanconan install yaml-cpp/0.7.0@Se preferir compilar manualmente, baixe os fontes do GitHub e execute:
mkdir build && cd buildcmake ..cmake --build .sudo cmake --install .Parsing de arquivo YAML
Suponha que temos um arquivo de configuração config.yaml:
server: host: "localhost" port: 8080 debug: true
database: driver: "postgresql" connection_string: "host=localhost dbname=test" pool_size: 10Exemplo de leitura e acesso aos dados em C++:
#include <yaml-cpp/yaml.h>#include <iostream>#include <string>
int main() { try { // Carregar arquivo YAML::Node config = YAML::LoadFile("config.yaml");
// Acessar nós aninhados std::string host = config["server"]["host"].as<std::string>(); int port = config["server"]["port"].as<int>(); bool debug = config["server"]["debug"].as<bool>();
std::cout << "Server: " << host << ":" << port << " (debug=" << (debug ? "on" : "off") << ")";
// Verificar existência de chave if (config["database"]["pool_size"]) { int pool = config["database"]["pool_size"].as<int>(); std::cout << "Pool size: " << pool << ""; }
// Iterar sobre sequência (lista) // Suponha que no YAML exista o campo: hosts: ["alpha", "beta", "gamma"] // for (const auto& h : config["hosts"]) { // std::cout << "Host: " << h.as<std::string>() << ""; // }
} catch (const YAML::Exception& e) { std::cerr << "YAML parsing error: " << e.what() << ""; return 1; } catch (const std::exception& e) { std::cerr << "General error: " << e.what() << ""; return 1; } return 0;}Criação de documento YAML
Com yaml-cpp é possível não apenas ler, mas também gerar YAML:
#include <yaml-cpp/yaml.h>#include <fstream>
int main() { YAML::Emitter out; out << YAML::BeginMap; out << YAML::Key << "application"; out << YAML::Value << "MyApp"; out << YAML::Key << "version"; out << YAML::Value << 2.5; out << YAML::Key << "features"; out << YAML::Value << YAML::BeginSeq; out << "logging" << "auth" << "cache"; ou Também na biblioteca
flume para Rust: guia completo com exemplos práticos
kotlinx-datetime para Kotlin: guia completo com exemplos práticos
Tokens JWT em PHP: biblioteca firebase/php-jwt e guia completo
Trabalho com CSV em PHP: leitura, escrita e processamento de dados