assemblylift_core_guest_macros/
lib.rs

1use quote::{quote, quote_spanned};
2use syn::{ItemFn, parse2};
3
4#[proc_macro_attribute]
5pub fn handler(_args: proc_macro::TokenStream, stream: proc_macro::TokenStream) -> proc_macro::TokenStream {
6    let input = parse2(stream.into())
7        .expect("could not parse token stream");
8    let ItemFn { attrs, vis, sig, block } = input;
9    let block_statements = &block.stmts;
10    let name = &sig.ident;
11    let ret = &sig.output;
12
13    if name != "main" {
14        return proc_macro::TokenStream::from(quote_spanned! { name.span() =>
15            compile_error!("only the main function can be tagged with #[handler]"),
16        });
17    }
18
19    proc_macro::TokenStream::from(quote! {
20        use assemblylift_core_io_guest;
21        use direct_executor;
22        use serde_json;
23        pub fn main() #ret {
24            use std::io::Read;
25            let mut fib = std::io::BufReader::new(assemblylift_core_io_guest::FunctionInputBuffer::new());
26            let mut input = String::new();
27            fib.read_to_string(&mut input).expect("could not read FIB to String");
28            let ctx = FunctionContext { input: input.trim_matches(char::from(0)).to_string() };
29            direct_executor::run_spinning(async {
30                #(#block_statements)*
31            });
32        }
33    })
34}