Travailler avec YAML en C++ : bibliothèques yaml-cpp et rapidyaml
\n\nYAML (YAML Ain't Markup Language) est un format de sérialisation de données largement utilisé pour les fichiers de configuration, les fichiers de description d'environnement (Docker Compose, Kubernetes), ainsi que pour l'échange de données entre services. Contrairement à JSON, YAML est plus lisible pour l'homme grâce à l'indentation et au support des commentaires.
\n\nEn C++, il n'y a pas de support intégré pour YAML, mais il existe d'excellentes bibliothèques tierces. Dans cet article, nous examinerons les deux plus populaires : yaml-cpp (classique, simple) et rapidyaml (moderne, très rapide). Vous apprendrez à installer les bibliothèques, à lire un fichier YAML, à le créer par programmation et à gérer les erreurs typiques.
\n\n1. Bibliothèque yaml-cpp
\n\nyaml-cpp est la bibliothèque de facto standard pour travailler avec YAML en C++. Elle fournit une API pratique, rappelant le travail avec les conteneurs STL. La bibliothèque prend en charge la spécification YAML 1.2.
Installation
\n\nLe moyen le plus simple est d'utiliser le gestionnaire de paquets vcpkg ou Conan. Pour Linux/macOS :
\n\n# Installation via vcpkg\nvcpkg install yaml-cpp\n\n# Installation via Conan\nconan install yaml-cpp/0.7.0@\n\nSi vous préférez compiler manuellement, téléchargez les sources depuis GitHub et exécutez :
\n\nmkdir build && cd build\ncmake ..\ncmake --build .\nsudo cmake --install .\n\nParsing d'un fichier YAML
\n\nSupposons que nous ayons un fichier de configuration config.yaml :
server:\n host: "localhost"\n port: 8080\n debug: true\n\ndatabase:\n driver: "postgresql"\n connection_string: "host=localhost dbname=test"\n pool_size: 10\n\nExemple de lecture et d'accès aux données en C++ :
\n\n#include <yaml-cpp/yaml.h>\n#include <iostream>\n#include <string>\n\nint main() {\n try {\n // Chargement du fichier\n YAML::Node config = YAML::LoadFile("config.yaml");\n\n // Accès aux nœuds imbriqués\n std::string host = config["server"]["host"].as<std::string>();\n int port = config["server"]["port"].as<int>();\n bool debug = config["server"]["debug"].as<bool>();\n\n std::cout << "Server: " << host << ":" << port\n << " (debug=" << (debug ? "on" : "off") << ")\\n";\n\n // Vérification de l'existence d'une clé\n if (config["database"]["pool_size"]) {\n int pool = config["database"]["pool_size"].as<int>();\n std::cout << "Pool size: " << pool << "\\n";\n }\n\n // Itération sur une séquence (liste)\n // Supposons que le YAML contienne un champ : hosts: ["alpha", "beta", "gamma"]\n // for (const auto& h : config["hosts"]) {\n // std::cout << "Host: " << h.as<std::string>() << "\\n";\n // }\n\n } catch (const YAML::Exception& e) {\n std::cerr << "YAML parsing error: " << e.what() << "\\n";\n return 1;\n } catch (const std::exception& e) {\n std::cerr << "General error: " << e.what() << "\\n";\n return 1;\n }\n return 0;\n}\n\nCréation d'un document YAML
\n\nAvec yaml-cpp, on peut non seulement lire, mais aussi générer du YAML :
#include <yaml-cpp/yaml.h>\n#include <fstream>\n\nint main() {\n YAML::Emitter out;\n out << YAML::BeginMap;\n out << YAML::Key << "application";\n out << YAML::Value << "MyApp";\n out << YAML::Key << "version";\n out << YAML::Value << 2.5;\n out << YAML::Key << "features";\n out << YAML::Value << YAML::BeginSeq;\n out << "logging" << "auth" << "cache";\n ou Aussi dans la bibliothèque
Travailler avec Markdown en Go (Golang) : bibliothèques, analyse et conversion
Envoi de SMS en JavaScript (Node.js) : API, bibliothèques et exemples de code
Journalisation pour TypeScript : la bibliothèque Winston
Travailler avec les jetons JWT en TypeScript : bibliothèque jsonwebtoken et guide complet
Validation des données en Kotlin : bibliothèques et approches