1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
extern crate proc_macro;

use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};

#[proc_macro_attribute]
pub fn config(_: TokenStream, input: TokenStream) -> TokenStream {
    let input_fn = parse_macro_input!(input as ItemFn);

    let fn_name = &input_fn.sig.ident;
    let generated_fn_name = syn::Ident::new(&format!("__{}", fn_name), fn_name.span());
    let _ = &input_fn.vis;

    let expanded = quote! {
        #input_fn

        #[export_name = "__config"]
        pub fn #generated_fn_name() -> u32 {
            crows_bindings::__set_config(#fn_name())
        }
    };

    TokenStream::from(expanded)
}