use proc_macro::TokenStream;
use syn::parse_macro_input;
pub fn refine(_args: TokenStream, input: TokenStream) -> TokenStream {
let fun = parse_macro_input!(input as syn::ItemFn);
let funame = fun.sig.ident.clone();
quote::quote! {
#[jade::polkavm_derive::polkavm_export(abi = jade::polkavm_derive::default_abi)]
extern "C" fn jade_refine(ptr: u32, size: u32) -> (u64, u64) {
#fun
let buf = unsafe { core::slice::from_raw_parts(ptr as *const u8, size as usize) };
let jade::service::vm::RefineParams {core, index, id, payload, package} =
jade::codec::decode(buf).expect("failed to decode refine parameters");
let result = #funame(core, index, id, payload, package);
((&result).as_ptr() as u64, result.len() as u64)
}
}
.into()
}