unity_yaml_rust/
lib.rs

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