use std::ffi::OsStr;
use spacegate_kernel::BoxResult;
#[macro_export]
macro_rules! dynamic_lib {
($(
$(#[$m:meta])*
$Type:ty
),*) => {
#[no_mangle]
pub extern "Rust" fn register(repo: &$crate::PluginRepository) {
$(
$(#[$m])*
repo.register::<$Type>();
)*
}
};
}
impl crate::PluginRepository {
pub unsafe fn register_dylib<P: AsRef<OsStr>>(&self, path: P) -> BoxResult<()> {
let lib = libloading::Library::new(path)?;
let register: libloading::Symbol<unsafe extern "Rust" fn(&crate::PluginRepository)> = lib.get(b"register")?;
register(self);
let lib = Box::new(lib);
Box::leak(lib);
Ok(())
}
}