1#![doc(html_root_url = "https://docs.rs/yaml-rust-davvid/0.5.2")]
38#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
39#![cfg_attr(feature = "cargo-clippy", warn(cognitive_complexity))]
40#![cfg_attr(
41 feature = "cargo-clippy",
42 allow(match_same_arms, should_implement_trait)
43)]
44
45extern crate hashlink;
46
47pub mod emitter;
48pub mod parser;
49pub mod scanner;
50pub mod yaml;
51
52pub use crate::emitter::{EmitError, YamlEmitter};
54pub use crate::parser::Event;
55pub use crate::scanner::ScanError;
56pub use crate::yaml::{Yaml, YamlLoader};
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn test_api() {
64 let s = "
65# from yaml-cpp example
66- name: Ogre
67 position: [0, 5, 0]
68 powers:
69 - name: Club
70 damage: 10
71 - name: Fist
72 damage: 8
73- name: Dragon
74 position: [1, 0, 10]
75 powers:
76 - name: Fire Breath
77 damage: 25
78 - name: Claws
79 damage: 15
80- name: Wizard
81 position: [5, -3, 0]
82 powers:
83 - name: Acid Rain
84 damage: 50
85 - name: Staff
86 damage: 3
87";
88 let docs = YamlLoader::load_from_str(s).unwrap();
89 let doc = &docs[0];
90
91 assert_eq!(doc[0]["name"].as_str().unwrap(), "Ogre");
92
93 let mut writer = String::new();
94 {
95 let mut emitter = YamlEmitter::new(&mut writer);
96 emitter.dump(doc).unwrap();
97 }
98
99 assert!(!writer.is_empty());
100 }
101
102 fn try_fail(s: &str) -> Result<Vec<Yaml>, ScanError> {
103 let t = YamlLoader::load_from_str(s)?;
104 Ok(t)
105 }
106
107 #[test]
108 fn test_fail() {
109 let s = "
110# syntax error
111scalar
112key: [1, 2]]
113key1:a2
114";
115 assert!(YamlLoader::load_from_str(s).is_err());
116 assert!(try_fail(s).is_err());
117 assert_eq!(
118 try_fail(s).unwrap_err().info(),
119 "mapping values are not allowed in this context"
120 );
121 assert_eq!(
122 try_fail(s).unwrap_err().to_string(),
123 "mapping values are not allowed in this context at line 4 column 4, i.e. byte index 26"
124 );
125 }
126}