use crate::prelude::*;
#[macro_export]
macro_rules! map_extern {
( $name:tt, $f:ident, $input:ty, $output:ty ) => {
$crate::paste::paste! {
mod [< __ $name _extern >] {
use super::*;
#[no_mangle]
pub extern "C" fn $name(guest_ptr: $crate::prelude::GuestPtr) -> $crate::prelude::GuestPtr {
match $crate::prelude::tracing::subscriber::set_global_default(
$crate::trace::WasmSubscriber::default()
) {
Ok(_) => {},
Err(e) => return $crate::prelude::return_err_ptr($crate::prelude::WasmError::Guest(e.to_string())),
}
let extern_io: $crate::prelude::ExternIO = match $crate::prelude::host_args(guest_ptr) {
Ok(v) => v,
Err(err_ptr) => return err_ptr,
};
let inner: $input = match extern_io.decode() {
Ok(v) => v,
Err(e) => {
let bytes = extern_io.0;
$crate::prelude::error!(output_type = std::any::type_name::<$output>(), bytes = ?bytes, "{}", e);
return $crate::prelude::return_err_ptr($crate::prelude::WasmError::Deserialize(bytes));
}
};
let output: $output = match super::$f(inner) {
Ok(v) => Ok(v),
Err(wasm_error) => return $crate::prelude::return_err_ptr(wasm_error),
};
match $crate::prelude::ExternIO::encode(output.unwrap()) {
Ok(v) => $crate::prelude::return_ptr::<$crate::prelude::ExternIO>(v),
Err(serialized_bytes_error) => $crate::prelude::return_err_ptr($crate::prelude::WasmError::Serialize(serialized_bytes_error)),
}
}
}
}
};
}
pub type ExternResult<T> = Result<T, WasmError>;