sise/lib.rs
1//! SISE (Simple S-expression) is a file format based on S-expressions.
2//!
3//! # Minimum Rust version
4//!
5//! The minimum Rust version required by this crate is 1.56.
6
7#![deny(
8 rust_2018_idioms,
9 trivial_casts,
10 trivial_numeric_casts,
11 unreachable_pub,
12 unused_must_use,
13 unused_qualifications
14)]
15#![forbid(unsafe_code)]
16#![no_std]
17
18extern crate alloc;
19#[cfg(feature = "std")]
20extern crate std;
21
22#[cfg(test)]
23mod tests;
24
25mod parse_tree;
26mod parser;
27mod serialize_tree;
28mod serializer;
29mod tree;
30mod util;
31
32pub use parse_tree::parse_tree;
33pub use parser::{ParseError, ParsedItem, Parser};
34pub use serialize_tree::serialize_tree;
35pub use serializer::{Serializer, SerializerStyle};
36pub use tree::TreeNode;
37pub use util::{check_atom, is_atom_chr, is_atom_string_chr};
38
39/// Macro to define trees of nodes with a lighter syntax.
40///
41/// # Example
42///
43/// ```
44/// use sise::sise_tree;
45///
46/// // atom
47/// let value1 = sise::TreeNode::Atom(String::from("atom"));
48/// let value2 = sise_tree!("atom");
49/// assert_eq!(value1, value2);
50///
51/// // ()
52/// let value1 = sise::TreeNode::List(vec![]);
53/// let value2 = sise_tree!([]);
54/// assert_eq!(value1, value2);
55///
56/// // (atom)
57/// let value1 = sise::TreeNode::List(vec![sise::TreeNode::Atom(String::from("atom"))]);
58/// let value2 = sise_tree!(["atom"]);
59/// assert_eq!(value1, value2);
60///
61/// // (atom (1 2 3) (a b c))
62/// let value1 = sise::TreeNode::List(vec![
63/// sise::TreeNode::Atom(String::from("atom")),
64/// sise::TreeNode::List(vec![
65/// sise::TreeNode::Atom(String::from("1")),
66/// sise::TreeNode::Atom(String::from("2")),
67/// sise::TreeNode::Atom(String::from("3")),
68/// ]),
69/// sise::TreeNode::List(vec![
70/// sise::TreeNode::Atom(String::from("a")),
71/// sise::TreeNode::Atom(String::from("b")),
72/// sise::TreeNode::Atom(String::from("c")),
73/// ]),
74/// ]);
75/// let value2 = sise_tree!(["atom", ["1", "2", "3"], ["a", "b", "c"]]);
76/// assert_eq!(value1, value2);
77/// ```
78#[macro_export]
79macro_rules! sise_tree {
80 ([$($item:tt),*]) => { $crate::TreeNode::List($crate::__vec![$($crate::sise_tree!($item)),*]) };
81 ([$($item:tt,)*]) => { $crate::TreeNode::List($crate::__vec![$($crate::sise_tree!($item)),*]) };
82 ($node:expr) => { $crate::TreeNode::from($node) };
83}
84
85#[doc(hidden)]
86pub use alloc::vec as __vec;