Bibliothek serde_yaml: Arbeiten mit YAML in Rust
\n\nYAML (YAML Ain't Markup Language) ist eines der beliebtesten Daten-Serialisierungsformate, das häufig für Konfigurationsdateien, die Beschreibung von Datenstrukturen und den Informationsaustausch zwischen Diensten verwendet wird. Im Rust-Ökosystem gibt es für die Arbeit mit YAML die ausgereifte und leistungsstarke Bibliothek serde_yaml, die auf dem leistungsfähigen Serialisierungs-Framework serde aufbaut. In diesem Artikel werden wir im Detail besprechen, wie man YAML-Dokumente in Rust parst, erstellt und verarbeitet.
Installation und Einbindung
\nFügen Sie zunächst die folgenden Abhängigkeiten zu Ihrer Cargo.toml hinzu:
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_yaml = "0.9"\nDie Bibliothek serde_yaml zieht automatisch alle notwendigen Komponenten zum Parsen und Generieren von YAML nach.
Basis-Deserialisierung (YAML → Rust-Struktur)
\nDas häufigste Szenario ist das Lesen einer Konfigurationsdatei. Definieren wir eine Struktur, die dem YAML-Dokument entspricht:
\nuse serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct Config {\n server: ServerConfig,\n database: DatabaseConfig,\n}\n\n#[derive(Debug, Deserialize)]\nstruct ServerConfig {\n host: String,\n port: u16,\n workers: Option<u32>,\n}\n\n#[derive(Debug, Deserialize)]\nstruct DatabaseConfig {\n url: String,\n pool_size: u32,\n}\nJetzt lesen wir eine YAML-Datei und wandeln sie in die Struktur um:
\nuse std::fs;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n let yaml_content = fs::read_to_string("config.yaml")?;\n let config: Config = serde_yaml::from_str(&yaml_content)?;\n \n println!("Server: {}:{}", config.server.host, config.server.port);\n println!("Datenbank: {}", config.database.url);\n \n Ok(())\n}\nBeispiel der Datei config.yaml:
server:\n host: "127.0.0.1"\n port: 8080\n workers: 4\ndatabase:\n url: "postgres://user:pass@localhost/db"\n pool_size: 10\n\nSerialisierung (Rust-Struktur → YAML)
\nDer umgekehrte Prozess – Erstellen eines YAML-Dokuments aus Daten im Speicher:
\nuse serde::Serialize;\n\n#[derive(Debug, Serialize)]\nstruct Project {\n name: String,\n version: String,\n dependencies: Vec<Dependency>,\n}\n\n#[derive(Debug, Serialize)]\nstruct Dependency {\n name: String,\n version: String,\n optional: bool,\n}\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n let project = Project {\n name: "my-app".to_string(),\n version: "0.1.0".to_string(),\n dependencies: vec![\n Dependency {\n name: "serde".to_string(),\n version: "1.0".to_string(),\n optional: false,\n },\n Dependency {\n name: "tokio".to_string(),\n version: "1.35".to_string(),\n optional: true,\n },\n ],\n };\n\n let yaml_string = serde_yaml::to_string(&project)?;\n println!("{}", yaml_string);\n \n // In Datei speichern\n std::fs::write("project.yaml", &yaml_string)?;\n \n Ok(())\n}\n\nArbeiten mit beliebigen YAML-Dokumenten
\nManchmal ist die Struktur von YAML im Voraus unbekannt. In solchen Fällen verwenden Sie serde_yaml::Value:
use serde_yaml::Value;\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n let yaml_data = "\napiVersion: v1\nkind: Service\nmetadata:\n name: my-service\n labels:\n app: web\nspec:\n ports:\n - port: 80\n targetPort: 8080\n selector:\n app: web\n";\n \n let value: Value = serde_yaml::from_str(yaml_data)?;\n \n // Zugriff auf verschachtelte Daten\n if let Some(ports) = value["spec"]["ports"].as_sequence() {\n for port in ports {\n if let Some(port_num Auch in der Bibliothek
MongoDB.Driver für C# (.NET): Komplette Anleitung mit Beispielen
Autorisierung und Authentifizierung in Rust: vollständiger Leitfaden
WebSocket-Bibliotheken für Node.js: ws, Socket.IO und uWebSockets.js
OneOf für C# (.NET): Vollständige Anleitung mit Beispielen