1
0
Fork 0
This commit is contained in:
Florian RICHER 2022-01-28 22:48:29 +01:00
parent 4b94fa645c
commit 2128b8ea1e
4 changed files with 36 additions and 16 deletions

View file

@ -1,6 +1,5 @@
#[repr(C)]
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct HotloadPlugin { pub struct HotloadPluginInfo {
// The plugin's name // The plugin's name
pub name: String, pub name: String,

View file

@ -1,8 +1,8 @@
use hotload_plugin::HotloadPlugin; use hotload_plugin::HotloadPluginInfo;
#[no_mangle] #[no_mangle]
pub extern "C" fn register() -> *const HotloadPlugin { pub extern fn plugin_info() -> *const HotloadPluginInfo {
let plugin = Box::new(HotloadPlugin { let plugin = Box::new(HotloadPluginInfo {
name: String::from("test_lib"), name: String::from("test_lib"),
version: String::from("0.1.0"), version: String::from("0.1.0"),
author: String::from("mrdev023"), author: String::from("mrdev023"),

View file

@ -3,10 +3,8 @@ mod plugin_manager;
fn main() { fn main() {
let plugin_manager = plugin_manager::PluginManager::new(); let plugin_manager = plugin_manager::PluginManager::new();
unsafe { for plugin in &plugin_manager.plugins {
for plugin in &plugin_manager.plugins { println!("Plugin {:?}", plugin.get_info().unwrap());
println!("Plugin {:?}", (*(*plugin)));
}
} }
println!("Plugins number : {}", plugin_manager.plugins.len()); println!("Plugins number : {}", plugin_manager.plugins.len());

View file

@ -1,10 +1,35 @@
use glob::glob; use glob::glob;
use hotload_plugin::HotloadPlugin; use hotload_plugin::HotloadPluginInfo;
use std::env::current_exe; use std::env::current_exe;
use std::path::PathBuf; use std::path::PathBuf;
pub struct Plugin {
library: libloading::Library,
}
impl Plugin {
pub fn new(library: libloading::Library) -> Self {
Self { library }
}
pub fn get_info(&self) -> Result<HotloadPluginInfo, String> {
let get_info_fn: libloading::Symbol<extern "C" fn() -> *const HotloadPluginInfo> = unsafe {
self.library
.get(b"plugin_info\0")
.map_err(|e| format!("{}", e))?
};
let info = get_info_fn();
if info.is_null() {
return Err(String::from("get_info function returned null"));
}
Ok(unsafe { (*info).clone() })
}
}
pub struct PluginManager { pub struct PluginManager {
pub plugins: Vec<*const HotloadPlugin>, pub plugins: Vec<Plugin>,
} }
impl PluginManager { impl PluginManager {
@ -22,13 +47,11 @@ impl PluginManager {
PluginManager { plugins } PluginManager { plugins }
} }
fn load_library(lib_file: PathBuf) -> *const HotloadPlugin { fn load_library(lib_file: PathBuf) -> Plugin {
println!("Loading library {:?}", lib_file); println!("Loading library {:?}", lib_file.file_name().unwrap());
unsafe { unsafe {
let lib = libloading::Library::new(lib_file).unwrap(); let lib = libloading::Library::new(lib_file).unwrap();
let register_func: libloading::Symbol<extern "C" fn() -> *const HotloadPlugin> = Plugin::new(lib)
lib.get(b"register").unwrap();
register_func()
} }
} }
} }