use crate::descriptor::{PluginDescriptor, PluginRegistry, FIDIUS_MAGIC, REGISTRY_VERSION};
pub struct DescriptorEntry {
pub descriptor: &'static PluginDescriptor,
}
inventory::collect!(DescriptorEntry);
fn build_registry() -> PluginRegistry {
let entries: Vec<*const PluginDescriptor> = inventory::iter::<DescriptorEntry>()
.map(|e| e.descriptor as *const PluginDescriptor)
.collect();
let count = entries.len() as u32;
let ptr = entries.as_ptr();
std::mem::forget(entries);
PluginRegistry {
magic: FIDIUS_MAGIC,
registry_version: REGISTRY_VERSION,
plugin_count: count,
descriptors: ptr,
}
}
pub fn get_registry() -> &'static PluginRegistry {
static REGISTRY: std::sync::OnceLock<PluginRegistry> = std::sync::OnceLock::new();
REGISTRY.get_or_init(build_registry)
}
#[macro_export]
macro_rules! fidius_plugin_registry {
() => {
#[no_mangle]
pub extern "C" fn fidius_get_registry() -> *const $crate::descriptor::PluginRegistry {
$crate::registry::get_registry() as *const _
}
};
}