use crate::Result;
pub trait Plugin: Send + Sync {
fn name(&self) -> &str;
fn version(&self) -> String;
fn initialize(&self) -> Result<()>;
fn shutdown(&self) -> Result<()>;
fn description(&self) -> &str {
""
}
fn author(&self) -> &str {
""
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicBool, Ordering};
struct TestPlugin {
initialized: AtomicBool,
}
impl Plugin for TestPlugin {
fn name(&self) -> &str {
"test-plugin"
}
fn version(&self) -> String {
"1.0.0".to_string()
}
fn initialize(&self) -> Result<()> {
self.initialized.store(true, Ordering::Release);
Ok(())
}
fn shutdown(&self) -> Result<()> {
self.initialized.store(false, Ordering::Release);
Ok(())
}
fn description(&self) -> &str {
"A test plugin"
}
fn author(&self) -> &str {
"Test Author"
}
}
#[test]
fn test_plugin_metadata() {
let plugin = TestPlugin {
initialized: AtomicBool::new(false),
};
assert_eq!(plugin.name(), "test-plugin");
assert_eq!(plugin.version(), "1.0.0");
assert_eq!(plugin.description(), "A test plugin");
assert_eq!(plugin.author(), "Test Author");
}
#[test]
fn test_plugin_lifecycle() {
let plugin = TestPlugin {
initialized: AtomicBool::new(false),
};
assert!(!plugin.initialized.load(Ordering::Acquire));
plugin.initialize().unwrap();
assert!(plugin.initialized.load(Ordering::Acquire));
plugin.shutdown().unwrap();
assert!(!plugin.initialized.load(Ordering::Acquire));
}
}