use std::collections::HashMap;
use mig_assembly::assembler::AssembledGroupInstance;
use crate::error::MappingError;
type HandlerFn =
Box<dyn Fn(&AssembledGroupInstance) -> Result<serde_json::Value, MappingError> + Send + Sync>;
pub struct HandlerRegistry {
handlers: HashMap<String, HandlerFn>,
}
impl HandlerRegistry {
pub fn new() -> Self {
Self {
handlers: HashMap::new(),
}
}
pub fn register<F>(&mut self, name: &str, handler: F)
where
F: Fn(&AssembledGroupInstance) -> Result<serde_json::Value, MappingError>
+ Send
+ Sync
+ 'static,
{
self.handlers.insert(name.to_string(), Box::new(handler));
}
pub fn has_handler(&self, name: &str) -> bool {
self.handlers.contains_key(name)
}
pub fn invoke(
&self,
name: &str,
instance: &AssembledGroupInstance,
) -> Result<serde_json::Value, MappingError> {
let handler = self
.handlers
.get(name)
.ok_or_else(|| MappingError::UnknownHandler {
name: name.to_string(),
file: String::new(),
})?;
handler(instance)
}
pub fn len(&self) -> usize {
self.handlers.len()
}
pub fn is_empty(&self) -> bool {
self.handlers.is_empty()
}
}
impl Default for HandlerRegistry {
fn default() -> Self {
Self::new()
}
}