#[macro_export]
macro_rules! export {
($create:path) => {
#[doc(hidden)]
fn __pmpx_instance() -> ::std::boxed::Box<dyn $crate::PackageManager> {
$create()
}
#[doc(hidden)]
unsafe extern "C" fn __pmpx_name() -> $crate::abi::PmpxStr {
$crate::abi::leak_str(__pmpx_instance().name())
}
#[doc(hidden)]
unsafe extern "C" fn __pmpx_family() -> $crate::abi::PmpxStr {
$crate::abi::leak_str(__pmpx_instance().family().as_str())
}
#[doc(hidden)]
unsafe extern "C" fn __pmpx_command(
project_root: $crate::abi::PmpxStr,
matched: *const $crate::abi::PmpxStr,
matched_len: ::std::primitive::usize,
verb: ::std::primitive::u32,
args: *const $crate::abi::PmpxStr,
args_len: ::std::primitive::usize,
out: *mut $crate::abi::PmpxCommand,
) -> ::std::primitive::u32 {
$crate::abi::guard(move || {
let plugin = __pmpx_instance();
unsafe {
$crate::abi::dispatch_command(
&*plugin,
project_root,
matched,
matched_len,
verb,
args,
args_len,
out,
)
}
})
}
#[doc(hidden)]
unsafe extern "C" fn __pmpx_free_str(s: $crate::abi::PmpxStr) {
unsafe { $crate::abi::free_str(s) }
}
#[doc(hidden)]
unsafe extern "C" fn __pmpx_free_command(c: *mut $crate::abi::PmpxCommand) {
unsafe { $crate::abi::free_command(c) }
}
#[doc(hidden)]
static __PMPX_ENTRY: $crate::abi::PmpxPluginV1 = $crate::abi::PmpxPluginV1 {
abi_version: $crate::abi::ABI_VERSION,
rustc_version: $crate::abi::build_rustc(),
target: $crate::abi::build_target(),
name: __pmpx_name,
family: __pmpx_family,
command: __pmpx_command,
free_str: __pmpx_free_str,
free_command: __pmpx_free_command,
};
#[unsafe(no_mangle)]
pub extern "C" fn pmpx_plugin_entry_v1() -> *const $crate::abi::PmpxPluginV1 {
&__PMPX_ENTRY
}
};
}