2020-12-11 23:37:22 +00:00
|
|
|
extern crate proc_macro;
|
|
|
|
|
|
|
|
use proc_macro::TokenStream;
|
|
|
|
use quote::quote;
|
|
|
|
use syn::{parse_macro_input, ItemFn};
|
|
|
|
|
|
|
|
#[proc_macro_attribute]
|
2020-12-12 13:22:51 +00:00
|
|
|
pub fn event_handler(_args: TokenStream, item: TokenStream) -> TokenStream {
|
2020-12-11 23:37:22 +00:00
|
|
|
let parsed = parse_macro_input!(item as ItemFn);
|
|
|
|
let fn_body = parsed.block; // function body
|
|
|
|
let sig = parsed.sig; // function signature
|
|
|
|
let fn_name = sig.ident; // function name/identifier
|
|
|
|
let fn_args = sig.inputs; // comma separated args
|
|
|
|
let fn_return = sig.output; // comma separated args
|
2020-12-12 13:01:54 +00:00
|
|
|
|
2020-12-11 23:37:22 +00:00
|
|
|
let out: proc_macro2::TokenStream = quote! {
|
2021-01-13 13:42:49 +00:00
|
|
|
#[allow(clippy::unnecessary_wraps)]
|
2020-12-11 23:37:22 +00:00
|
|
|
#[no_mangle]
|
2021-03-01 18:00:44 +00:00
|
|
|
pub fn #fn_name(intern__ptr: i64, intern__len: i64) -> i64 {
|
|
|
|
let input = ::veloren_plugin_rt::read_input(intern__ptr as _,intern__len as _).unwrap();
|
2020-12-12 13:22:51 +00:00
|
|
|
#[inline]
|
2020-12-11 23:37:22 +00:00
|
|
|
fn inner(#fn_args) #fn_return {
|
|
|
|
#fn_body
|
|
|
|
}
|
2020-12-12 13:22:51 +00:00
|
|
|
// Artificially force the event handler to be type-correct
|
2020-12-13 23:08:15 +00:00
|
|
|
fn force_event<E: ::veloren_plugin_rt::api::Event>(event: E, inner: fn(E) -> E::Response) -> E::Response {
|
2020-12-12 13:22:51 +00:00
|
|
|
inner(event)
|
|
|
|
}
|
2020-12-13 23:08:15 +00:00
|
|
|
::veloren_plugin_rt::write_output(&force_event(input, inner))
|
2020-12-11 23:37:22 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
out.into()
|
2020-12-12 13:01:54 +00:00
|
|
|
}
|