lp 0.2.5

An embeddable plugin system for Rust applications.
Documentation
#[cfg(feature = "dynamic-loading")]
use crate::errors::LoadError;
#[cfg(feature = "dynamic-loading")]
pub use libloading::{Library, Symbol};

#[cfg(feature = "dynamic-loading")]
pub trait Loadable
where
    Self: Sized,
{
    unsafe fn load(path: &str, symbol: &str) -> Result<Self, LoadError>;
}

#[cfg(feature = "dynamic-loading")]
pub struct Lib<T> {
    _lib: Library,
    pub f: Option<T>,
}

#[cfg(feature = "dynamic-loading")]
impl<T> Loadable for Lib<Symbol<'static, T>>
where
    T: 'static,
{
    unsafe fn load(path: &str, symbol: &str) -> Result<Self, LoadError> {
        let lib = unsafe { Library::new(path) }?;

        let symbol_name = format!("{}\0", symbol);
        let f: Symbol<T> = unsafe {
            lib.get(symbol_name.as_bytes())
                .map_err(|_| LoadError::Symbol {
                    symbol_name: symbol.into(),
                })
        }?;

        let f: Symbol<'static, T> = unsafe { std::mem::transmute(f) };

        Ok(Self {
            _lib: lib,
            f: Some(f),
        })
    }
}