veloren/plugin/derive/src/lib.rs

28 lines
921 B
Rust
Raw Normal View History

extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn export_function(_args: TokenStream, item: TokenStream) -> TokenStream {
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
let out: proc_macro2::TokenStream = quote! {
#[no_mangle]
pub fn #fn_name(intern__ptr: i32, intern__len: u32) -> i32 {
2020-12-12 13:01:54 +00:00
let input = plugin_rt::read_input(intern__ptr,intern__len).unwrap();
fn inner(#fn_args) #fn_return {
#fn_body
}
2020-12-12 13:01:54 +00:00
plugin_rt::write_output(&inner(input))
}
};
out.into()
2020-12-12 13:01:54 +00:00
}