lotus_bindgen_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3
4#[proc_macro_attribute]
5pub fn lotus_bindgen(_attr: TokenStream, item: TokenStream) -> TokenStream {
6    if let Ok(input) = syn::parse::<syn::ForeignItemFn>(item.clone()) {
7        foreign_item_fn(input)
8    } else if let Ok(input) = syn::parse::<syn::ItemFn>(item) {
9        item_fn(input)
10    } else {
11        panic!("lotus_bindgen can only be used on functions");
12    }
13}
14
15fn foreign_item_fn(input: syn::ForeignItemFn) -> proc_macro::TokenStream {
16    let syn::ForeignItemFn {
17        attrs, vis, sig, ..
18    } = input;
19
20    // let x = sig.inputs.iter().next().unwrap().clone();
21    // let x = match x {
22    //     syn::FnArg::Typed(x) => x,
23    //     _ => panic!("Expected a typed argument"),
24    // };
25
26    // let x = x.ty;
27    // x.
28
29    let output = quote!(
30        #(#attrs)*
31        #vis #sig;
32    );
33
34    proc_macro::TokenStream::from(output)
35}
36
37fn item_fn(input: syn::ItemFn) -> proc_macro::TokenStream {
38    let syn::ItemFn {
39        attrs,
40        vis,
41        sig,
42        block,
43        ..
44    } = input;
45
46    let output = quote!(
47        #(#attrs)*
48        #vis #sig #block
49    );
50
51    proc_macro::TokenStream::from(output)
52}