use crate::{
debug,
plugin::{org::OrgPlugin, role::RolePlugin},
Engine,
};
mod org;
mod role;
#[cfg(test)]
mod tests;
pub trait ActPlugin: Send + Sync {
fn on_init(&self, engine: &Engine);
}
pub async fn init(engine: &Engine) {
debug!("plugin::init");
let mut plugins = &mut *engine.plugins.lock().unwrap();
register_plugins_default(&mut plugins);
for plugin in plugins.into_iter() {
plugin.on_init(engine);
}
}
fn register_plugins_default(plugins: &mut Vec<Box<dyn ActPlugin>>) {
#[cfg(feature = "role")]
plugins.push(Box::new(RolePlugin::new()));
#[cfg(feature = "org")]
plugins.push(Box::new(OrgPlugin::new()));
}
impl Engine {
pub fn register_plugin<T: ActPlugin + 'static + Clone>(&self, plugin: &T) {
self.plugins.lock().unwrap().push(Box::new(plugin.clone()));
}
}