use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn reflow_pack(_attr: TokenStream, item: TokenStream) -> TokenStream {
let func = parse_macro_input!(item as ItemFn);
let user_ident = &func.sig.ident;
let expanded = quote! {
#func
#[unsafe(no_mangle)]
pub extern "C" fn reflow_pack_abi_version() -> u32 {
::reflow_pack_sdk::REFLOW_PACK_ABI_VERSION
}
#[cfg(not(target_arch = "wasm32"))]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn reflow_pack_register(
host: *mut ::reflow_pack_sdk::PackHostVtable,
) -> i32 {
if host.is_null() {
return ::reflow_pack_sdk::PackRegisterStatus::NullArg as i32;
}
let result = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| {
let mut wrapper = ::reflow_pack_sdk::PackHost::from_vtable(unsafe { &mut *host });
#user_ident(&mut wrapper);
wrapper.take_status()
}));
match result {
Ok(status) => status,
Err(_) => ::reflow_pack_sdk::PackRegisterStatus::Internal as i32,
}
}
#[cfg(target_arch = "wasm32")]
#[unsafe(no_mangle)]
pub extern "C" fn __reflow_pack_register() -> i32 {
let result = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| {
let mut wrapper = ::reflow_pack_sdk::WasmPackHost::new();
#user_ident(&mut wrapper);
wrapper.take_status()
}));
match result {
Ok(status) => status,
Err(_) => ::reflow_pack_sdk::PackRegisterStatus::Internal as i32,
}
}
};
TokenStream::from(expanded)
}