use super::plugin_manager::PluginRegistrar;
use crate::errors::NitriteResult;
use crate::nitrite_config::NitriteConfig;
use std::ops::Deref;
use std::sync::Arc;
pub trait NitritePluginProvider: Send + Sync {
fn initialize(&self, config: NitriteConfig) -> NitriteResult<()>;
fn close(&self) -> NitriteResult<()>;
fn as_plugin(&self) -> NitritePlugin;
}
pub trait NitriteModule: Send + Sync {
fn plugins(&self) -> NitriteResult<Vec<NitritePlugin>>;
fn load(&self, plugin_registrar: &PluginRegistrar) -> NitriteResult<()>;
}
#[derive(Clone)]
pub struct NitritePlugin {
inner: Arc<dyn NitritePluginProvider>,
}
impl NitritePlugin {
pub fn new<T: NitritePluginProvider + 'static>(inner: T) -> Self {
NitritePlugin { inner: Arc::new(inner) }
}
}
impl Deref for NitritePlugin {
type Target = Arc<dyn NitritePluginProvider>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::common::PluginManager;
use crate::nitrite_config::NitriteConfig;
use std::sync::Arc;
struct MockPlugin;
impl NitritePluginProvider for MockPlugin {
fn initialize(&self, _config: NitriteConfig) -> NitriteResult<()> {
Ok(())
}
fn close(&self) -> NitriteResult<()> {
Ok(())
}
fn as_plugin(&self) -> NitritePlugin {
NitritePlugin::new(MockPlugin)
}
}
struct MockModule;
impl NitriteModule for MockModule {
fn plugins(&self) -> NitriteResult<Vec<NitritePlugin>> {
Ok(vec![NitritePlugin::new(MockPlugin)])
}
fn load(&self, _plugin_registrar: &PluginRegistrar) -> NitriteResult<()> {
Ok(())
}
}
#[test]
fn test_nitrite_plugin_initialize() {
let plugin = NitritePlugin::new(MockPlugin);
let config = NitriteConfig::default();
assert!(plugin.initialize(config).is_ok());
}
#[test]
fn test_nitrite_plugin_close() {
let plugin = NitritePlugin::new(MockPlugin);
assert!(plugin.close().is_ok());
}
#[test]
fn test_nitrite_plugin_as_plugin() {
let plugin = NitritePlugin::new(MockPlugin);
let plugin_clone = plugin.as_plugin();
assert_eq!(Arc::strong_count(&plugin.inner), Arc::strong_count(&plugin_clone.inner));
}
#[test]
fn test_nitrite_module_plugins() {
let module = MockModule;
let plugins = module.plugins().unwrap();
assert_eq!(plugins.len(), 1);
}
#[test]
fn test_nitrite_module_load() {
let module = MockModule;
let plugin_registrar = PluginRegistrar::new(PluginManager::new());
assert!(module.load(&plugin_registrar).is_ok());
}
}