use tera::Context;
use akita::prelude::TableInfo;
pub trait Plugin: Send + Sync {
fn process(&self, table: &TableInfo, context: &mut Context);
}
pub fn load_plugins(plugin_names: &[String]) -> Result<Vec<Box<dyn Plugin>>, Box<dyn std::error::Error>> {
let mut plugins: Vec<Box<dyn Plugin>> = Vec::new();
for name in plugin_names {
match name.as_str() {
"log_plugin" => plugins.push(Box::new(LogPlugin {})),
"additional_fields_plugin" => plugins.push(Box::new(AdditionalFieldsPlugin {})),
_ => println!("Warning: Unknown plugin {}", name),
}
}
Ok(plugins)
}
pub struct LogPlugin;
impl Plugin for LogPlugin {
fn process(&self, table: &TableInfo, _: &mut Context) {
println!("Processing table: {}", table.name.name());
}
}
pub struct AdditionalFieldsPlugin;
impl Plugin for AdditionalFieldsPlugin {
fn process(&self, table: &TableInfo, context: &mut Context) {
context.insert("additional_metadata", &format!("Metadata for table {}", table.name.name()));
}
}