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