1 // Copyright 2015, Yuheng Chen. See the LICENSE file at the top-level 2 // directory of this distribution. 3 4 //! YAML 1.2 implementation in pure Rust. 5 //! 6 //! # Usage 7 //! 8 //! This crate is [on github](https://github.com/chyh1990/yaml-rust) and can be 9 //! used by adding `yaml-rust` to the dependencies in your project's `Cargo.toml`. 10 //! 11 //! ```toml 12 //! [dependencies.yaml-rust] 13 //! git = "https://github.com/chyh1990/yaml-rust.git" 14 //! ``` 15 //! 16 //! And this in your crate root: 17 //! 18 //! ```rust 19 //! extern crate yaml_rust; 20 //! ``` 21 //! 22 //! Parse a string into `Vec<Yaml>` and then serialize it as a YAML string. 23 //! 24 //! # Examples 25 //! 26 //! ``` 27 //! use yaml_rust::{YamlLoader, YamlEmitter}; 28 //! 29 //! let docs = YamlLoader::load_from_str("[1, 2, 3]").unwrap(); 30 //! let doc = &docs[0]; // select the first document 31 //! assert_eq!(doc[0].as_i64().unwrap(), 1); // access elements by index 32 //! 33 //! let mut out_str = String::new(); 34 //! let mut emitter = YamlEmitter::new(&mut out_str); 35 //! emitter.dump(doc).unwrap(); // dump the YAML object to a String 36 //! 37 //! ``` 38 39 #![doc(html_root_url = "https://docs.rs/yaml-rust/0.4.5")] 40 #![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))] 41 #![cfg_attr(feature = "cargo-clippy", warn(cyclomatic_complexity))] 42 #![cfg_attr( 43 feature = "cargo-clippy", 44 allow(match_same_arms, should_implement_trait) 45 )] 46 47 extern crate linked_hash_map; 48 49 pub mod emitter; 50 pub mod parser; 51 pub mod scanner; 52 pub mod yaml; 53 54 // reexport key APIs 55 pub use crate::emitter::{EmitError, YamlEmitter}; 56 pub use crate::parser::Event; 57 pub use crate::scanner::ScanError; 58 pub use crate::yaml::{Yaml, YamlLoader}; 59 60 #[cfg(test)] 61 mod tests { 62 use super::*; 63 64 #[test] test_api()65 fn test_api() { 66 let s = " 67 # from yaml-cpp example 68 - name: Ogre 69 position: [0, 5, 0] 70 powers: 71 - name: Club 72 damage: 10 73 - name: Fist 74 damage: 8 75 - name: Dragon 76 position: [1, 0, 10] 77 powers: 78 - name: Fire Breath 79 damage: 25 80 - name: Claws 81 damage: 15 82 - name: Wizard 83 position: [5, -3, 0] 84 powers: 85 - name: Acid Rain 86 damage: 50 87 - name: Staff 88 damage: 3 89 "; 90 let docs = YamlLoader::load_from_str(s).unwrap(); 91 let doc = &docs[0]; 92 93 assert_eq!(doc[0]["name"].as_str().unwrap(), "Ogre"); 94 95 let mut writer = String::new(); 96 { 97 let mut emitter = YamlEmitter::new(&mut writer); 98 emitter.dump(doc).unwrap(); 99 } 100 101 assert!(!writer.is_empty()); 102 } 103 try_fail(s: &str) -> Result<Vec<Yaml>, ScanError>104 fn try_fail(s: &str) -> Result<Vec<Yaml>, ScanError> { 105 let t = YamlLoader::load_from_str(s)?; 106 Ok(t) 107 } 108 109 #[test] test_fail()110 fn test_fail() { 111 let s = " 112 # syntax error 113 scalar 114 key: [1, 2]] 115 key1:a2 116 "; 117 assert!(YamlLoader::load_from_str(s).is_err()); 118 assert!(try_fail(s).is_err()); 119 } 120 121 } 122