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}