use zenoh_result::ZResult;
use crate::Plugin;
pub type PluginLoaderVersion = u64;
pub const PLUGIN_LOADER_VERSION: PluginLoaderVersion = 2;
type StartFn<StartArgs, Instance> = fn(&str, &StartArgs) -> ZResult<Instance>;
#[repr(C)]
pub struct PluginVTable<StartArgs, Instance> {
pub plugin_version: &'static str,
pub plugin_long_version: &'static str,
pub start: StartFn<StartArgs, Instance>,
}
impl<StartArgs, Instance> PluginVTable<StartArgs, Instance> {
pub fn new<ConcretePlugin: Plugin<StartArgs = StartArgs, Instance = Instance>>() -> Self {
Self {
plugin_version: ConcretePlugin::PLUGIN_VERSION,
plugin_long_version: ConcretePlugin::PLUGIN_LONG_VERSION,
start: ConcretePlugin::start,
}
}
}
#[macro_export]
macro_rules! declare_plugin {
($ty: path) => {
#[no_mangle]
fn get_plugin_loader_version() -> $crate::PluginLoaderVersion {
$crate::PLUGIN_LOADER_VERSION
}
#[no_mangle]
fn get_compatibility() -> $crate::Compatibility {
use zenoh_plugin_trait::StructVersion;
$crate::Compatibility::new(
<$ty as $crate::Plugin>::StartArgs::struct_version(),
<$ty as $crate::Plugin>::StartArgs::struct_features(),
)
}
#[no_mangle]
fn load_plugin() -> $crate::PluginVTable<
<$ty as $crate::Plugin>::StartArgs,
<$ty as $crate::Plugin>::Instance,
> {
$crate::PluginVTable::new::<$ty>()
}
};
}