lexpr_macros/
lib.rs

1//! Internal crate implementing macros exposed by the `lexpr` crate.
2
3#![recursion_limit = "128"]
4#![warn(rust_2018_idioms)]
5
6mod generator;
7mod parser;
8mod value;
9
10use proc_macro2::TokenStream;
11use quote::quote;
12
13#[proc_macro]
14pub fn sexp(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
15    let output = match expand(TokenStream::from(input)) {
16        Err(e) => {
17            let msg = format!("could not parse s-expression: {:?}", e);
18            quote! { compile_error!(#msg) }
19        }
20        Ok(output) => output,
21    };
22
23    proc_macro::TokenStream::from(output)
24}
25
26fn expand(input: TokenStream) -> Result<TokenStream, parser::ParseError> {
27    let value = parser::parse(input)?;
28    Ok(generator::generate(value))
29}