use libloading::{Library, Symbol}; use crate::{ModuleError, logger::SetupLogger}; // #[derive(Clone, Copy)] pub struct Module { // name: String, lib: Library, } impl Module { pub fn new(path: &str) -> Result { let lib = unsafe { Library::new(&path) }.map_err(|e| ModuleError::LibLoadingError(e))?; let this = Self { // name: path.to_owned(), lib, }; if let Ok(setup_logger) = this.get_symbol::(b"setup_logger") { setup_logger(log::logger(), log::max_level()).map_err(|e| ModuleError::LogError(e))?; } else { warn!("setup_logger not found"); } Ok(this) } pub fn get_symbol(&self, symbol: &[u8]) -> Result, ModuleError> { let symbol = unsafe { self.lib.get::(symbol) } .map_err(|e| ModuleError::LinkError(format!("Failed to load symbol: {}", e)))?; Ok(symbol) } pub fn get_interface(&self) -> Result { if let Ok(interface_function) = self.get_symbol:: T>(b"interface") { Ok(interface_function()) } else { Err(ModuleError::LinkError(format!( "Interface function not found!" ))) } } } // extern "C" fn test1234() { // info!("Test1234!"); // }