العمل مع YAML في C++: مكتبات yaml-cpp و rapidyaml
\n\nYAML (YAML Ain't Markup Language) هو تنسيق لتسلسل البيانات يُستخدم على نطاق واسع لملفات التكوين، وملفات وصف البيئة (Docker Compose، Kubernetes)، وكذلك لتبادل البيانات بين الخدمات. على عكس JSON، فإن YAML أكثر قابلية للقراءة من قبل الإنسان بفضل المسافات البادئة ودعم التعليقات.
\n\nلا يحتوي C++ على دعم مدمج لـ YAML، ولكن توجد مكتبات خارجية ممتازة. في هذه المقالة، سننظر في المكتبتين الأكثر شيوعًا: yaml-cpp (كلاسيكية، بسيطة) و rapidyaml (حديثة، سريعة جدًا). ستتعلم كيفية تثبيت المكتبات، وقراءة ملف YAML، وإنشائه برمجيًا، ومعالجة الأخطاء النموذجية.
\n\n1. مكتبة yaml-cpp
\n\nyaml-cpp هي المكتبة القياسية الفعلية للعمل مع YAML في C++. توفر واجهة برمجة تطبيقات (API) ملائمة تشبه العمل مع حاويات STL. تدعم المكتبة مواصفات YAML 1.2.
التثبيت
\n\nأسهل طريقة هي استخدام مدير الحزم vcpkg أو Conan. بالنسبة لنظامي Linux/macOS:
\n\n# التثبيت عبر vcpkg\nvcpkg install yaml-cpp\n\n# التثبيت عبر Conan\nconan install yaml-cpp/0.7.0@\n\nإذا كنت تفضل البناء يدويًا، قم بتنزيل الكود المصدري من GitHub ونفذ:
\n\nmkdir build && cd build\ncmake ..\ncmake --build .\nsudo cmake --install .\n\nتحليل ملف YAML
\n\nلنفترض أن لدينا ملف تكوين 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\nمثال على القراءة والوصول إلى البيانات في C++:
\n\n#include <yaml-cpp/yaml.h>\n#include <iostream>\n#include <string>\n\nint main() {\n try {\n // تحميل الملف\n YAML::Node config = YAML::LoadFile("config.yaml");\n\n // الوصول إلى العقد المتداخلة\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 // التحقق من وجود المفتاح\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 // التكرار عبر التسلسل (القائمة)\n // افترض أن YAML يحتوي على حقل: 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\nإنشاء مستند YAML
\n\nباستخدام yaml-cpp، لا يمكنك القراءة فحسب، بل يمكنك أيضًا توليد 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