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}