mod plugin_loader;
pub use plugin_loader::PluginLoader;
use std::path::PathBuf;
pub fn get_plugin_path(name: &str) -> PathBuf {
let file_name = match std::env::consts::OS {
"windows" => format!("{}.dll", name),
"macos" => format!("lib{}.dylib", name),
_ => format!("lib{}.so", name),
};
PathBuf::from("target/debug").join(file_name)
}
pub struct PluginManager {
plugins: Vec<Box<dyn plugrs_interface::Plugin>>,
}
impl PluginManager {
pub fn new() -> Self {
Self {
plugins: Vec::new(),
}
}
pub fn load_plugin(&mut self, path: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
println!("尝试加载插件: {:?}", path);
let loader = PluginLoader::new(path)?;
let plugin = loader.load_plugin()?;
self.plugins.push(plugin);
Ok(())
}
pub fn execute_all(&self) -> Vec<i32> {
self.plugins
.iter()
.map(|plugin| {
println!("执行插件: {}", plugin.name());
plugin.execute()
})
.collect()
}
pub fn plugin_count(&self) -> usize {
self.plugins.len()
}
}
impl Default for PluginManager {
fn default() -> Self {
Self::new()
}
}