use crate::VanguardPlugin;
#[repr(C)]
pub struct RawPlugin {
pub instance: Box<dyn VanguardPlugin>,
}
pub type CreatePluginFn = unsafe extern "C" fn() -> *mut RawPlugin;
pub const CREATE_PLUGIN_SYMBOL: &[u8] = b"create_plugin";
#[macro_export]
macro_rules! export_plugin {
($plugin_type:ty) => {
#[no_mangle]
pub unsafe extern "C" fn create_plugin() -> *mut $crate::exports::RawPlugin {
let plugin = <$plugin_type>::default();
let instance = Box::new(plugin) as Box<dyn $crate::VanguardPlugin>;
let raw = $crate::exports::RawPlugin { instance };
Box::into_raw(Box::new(raw))
}
};
}
#[macro_export]
macro_rules! export_plugin_with {
($plugin_type:ty, $constructor:expr) => {
#[no_mangle]
pub unsafe extern "C" fn create_plugin() -> *mut $crate::exports::RawPlugin {
let plugin = $constructor();
let instance = Box::new(plugin) as Box<dyn $crate::VanguardPlugin>;
let raw = $crate::exports::RawPlugin { instance };
Box::into_raw(Box::new(raw))
}
};
}