yscl/
lib.rs

1//! A fast and simple parser for [YSCL](https://github.com/kylejlin/yscl).
2//!
3//! ## Example
4//! ```rust
5//! use yscl::prelude::*;
6//!
7//! let map = parse_doc(r#"
8//! kantu_version = "1.0.0"
9//! name = "fibonacci"
10//! license = [
11//!     "MIT"
12//!     "Apache-2.0"
13//! ]
14//! dependencies = {
15//!     yscl = "1.0.0"
16//!     json = "1.0.0"
17//! }
18//! author = "xeklan (黒🐑)"
19//! "#).unwrap();
20//!
21//! let expected = Map {
22//!     entries: vec![
23//!         MapEntry {
24//!             key: Identifier::new("kantu_version".to_owned()).unwrap(),
25//!             value: Node::Atom(
26//!                 Atom {
27//!                     value: "1.0.0".to_owned(),
28//!                 },
29//!             ),
30//!         },
31//!         MapEntry {
32//!             key: Identifier::new("name".to_owned()).unwrap(),
33//!             value: Node::Atom(
34//!                 Atom {
35//!                     value: "fibonacci".to_owned(),
36//!                 },
37//!             ),
38//!         },
39//!         MapEntry {
40//!             key: Identifier::new("license".to_owned()).unwrap(),
41//!             value: Node::List(
42//!                 List {
43//!                     elements: vec![
44//!                         Node::Atom(
45//!                             Atom {
46//!                                 value: "MIT".to_owned(),
47//!                             },
48//!                         ),
49//!                         Node::Atom(
50//!                             Atom {
51//!                                 value: "Apache-2.0".to_owned(),
52//!                             },
53//!                         ),
54//!                     ],
55//!                 },
56//!             ),
57//!         },
58//!         MapEntry {
59//!             key: Identifier::new("dependencies".to_owned()).unwrap(),
60//!             value: Node::Map(
61//!                 Map {
62//!                     entries: vec![
63//!                         MapEntry {
64//!                             key: Identifier::new("yscl".to_owned()).unwrap(),
65//!                             value: Node::Atom(
66//!                                 Atom {
67//!                                     value: "1.0.0".to_owned(),
68//!                                 },
69//!                             ),
70//!                         },
71//!                         MapEntry {
72//!                             key: Identifier::new("json".to_owned()).unwrap(),
73//!                             value: Node::Atom(
74//!                                 Atom {
75//!                                     value: "1.0.0".to_owned(),
76//!                                 },
77//!                             ),
78//!                         },
79//!                     ],
80//!                 },
81//!             ),
82//!         },
83//!         MapEntry {
84//!             key: Identifier::new("author".to_owned()).unwrap(),
85//!             value: Node::Atom(
86//!                 Atom {
87//!                     value: "xeklan (黒🐑)".to_owned(),
88//!                 },
89//!             ),
90//!         },
91//!     ],
92//! };
93//!
94//! assert_eq!(expected, map);
95//! ```
96
97#[macro_use]
98pub mod macros;
99
100pub mod parse;
101pub mod tree;
102
103pub mod prelude {
104    pub use crate::{macros::*, parse::*, tree::*};
105
106    pub use crate::yscl_node;
107}
108
109#[cfg(test)]
110mod tests;