crows_macros/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, ItemFn};
6
7#[proc_macro_attribute]
8pub fn config(_: TokenStream, input: TokenStream) -> TokenStream {
9    let input_fn = parse_macro_input!(input as ItemFn);
10
11    let fn_name = &input_fn.sig.ident;
12    let generated_fn_name = syn::Ident::new(&format!("__{}", fn_name), fn_name.span());
13    let _ = &input_fn.vis;
14
15    let expanded = quote! {
16        #input_fn
17
18        #[export_name = "__config"]
19        pub fn #generated_fn_name() -> u32 {
20            crows_bindings::__set_config(#fn_name())
21        }
22    };
23
24    TokenStream::from(expanded)
25}