use plux_mock::MockManager;
use plux_rs::prelude::*;
use std::collections::HashMap;
use crate::plugins::{dependency, utils::get_plugin_path};
mod plugins;
#[plux_rs::function]
fn log_message(_: (), message: &i32) -> i32 {
println!("Host log: {}", message);
*message
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut plugins = HashMap::new();
dependency::plugin_a_v1::insert_plugin(&mut plugins);
dependency::plugin_b_v1::insert_plugin(&mut plugins);
dependency::plugin_c_v1::insert_plugin(&mut plugins);
dependency::plugin_d_v1::insert_plugin(&mut plugins);
let mut loader = SimpleLoader::new();
loader.context(move |mut ctx| {
ctx.register_manager(MockManager::from_plugins(plugins))?;
ctx.register_function(log_message());
ctx.register_request(Request::new("main".to_string(), vec![], None));
Ok::<(), Box<dyn std::error::Error>>(())
})?;
let paths = [
dependency::plugin_a_v1::FILENAME,
dependency::plugin_b_v1::FILENAME,
dependency::plugin_c_v1::FILENAME,
dependency::plugin_d_v1::FILENAME,
]
.into_iter()
.map(|filename| get_plugin_path(format!("dependency/{}", filename)))
.collect::<Vec<_>>();
let bundles = loader
.load_plugins(paths.iter().map(|path| path.to_str().unwrap()))
.unwrap();
println!("Loaded {} plugins with dependencies", bundles.len());
if let Some(plugin) = loader.get_plugin("plugin_c", &semver::Version::parse("1.0.0").unwrap()) {
println!("Plugin with dependencies loaded: {}", plugin.info().bundle);
if let Err(e) = plugin.call_request("main", &[]).unwrap() {
eprintln!("Plugin error: {}", e);
}
}
for bundle in &bundles {
let plugin = loader.get_plugin_by_bundle(bundle).unwrap();
println!("Plugin: {} (Info: {})", bundle, plugin.info().info);
}
Ok(())
}