1#![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}