bakkesmod_macros/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5
6#[proc_macro_attribute]
7pub fn plugin_init(_attr: TokenStream, input: TokenStream) -> TokenStream {
8    let parsed_input: syn::ItemFn = syn::parse_macro_input!(input as syn::ItemFn);
9    let name = parsed_input.clone().sig.ident;
10
11    let tokens = quote! {
12        #parsed_input
13
14        #[no_mangle]
15        pub extern "C" fn InitPlugin(id: u64) {
16            bakkesmod_init(id);
17            #name();
18        }
19
20        #[no_mangle]
21        pub extern "C" fn ExitPlugin() {
22            bakkesmod_exit();
23        }
24    };
25
26    tokens.into()
27}