yaml_rust_davvid/
lib.rs

1// Copyright 2015, Yuheng Chen. See the LICENSE file at the top-level
2// directory of this distribution.
3
4//! **IMPORTANT** This crate has merged with `yaml-rust2`.
5//! Please upgrade to [yaml-rust2](https://github.com/Ethiraric/yaml-rust2).
6//!
7//! YAML 1.2 implementation in pure Rust.
8//!
9//! # Usage
10//!
11//! This crate is [on github](https://github.com/davvid/yaml-rust) and can be
12//! used by adding `yaml-rust-davvid` to the dependencies in your project's
13//! `Cargo.toml`.
14//!
15//! ```toml
16//! [dependencies]
17//! yaml-rust = { version = "0.6", package = "yaml-rust-davvid" }
18//! ```
19//!
20//! Parse a string into `Vec<Yaml>` and then serialize it as a YAML string.
21//!
22//! # Examples
23//! ```
24//! # extern crate yaml_rust_davvid as yaml_rust;
25//! use yaml_rust::{YamlLoader, YamlEmitter};
26//!
27//! let docs = YamlLoader::load_from_str("[1, 2, 3]").unwrap();
28//! let doc = &docs[0]; // select the first document
29//! assert_eq!(doc[0].as_i64().unwrap(), 1); // access elements by index
30//!
31//! let mut out_str = String::new();
32//! let mut emitter = YamlEmitter::new(&mut out_str);
33//! emitter.dump(doc).unwrap(); // dump the YAML object to a String
34//!
35//! ```
36
37#![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
52// reexport key APIs
53pub 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}