assemblylift_core_guest_macros/
lib.rs1use 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}