use std::collections::HashMap;
pub trait FactoryTrait<T>: Send + Sync {
fn name(&self) -> &str;
fn apply(&self, entity: &mut T);
}
pub struct TraitRegistry<T> {
traits: HashMap<String, Box<dyn FactoryTrait<T>>>,
}
impl<T> TraitRegistry<T> {
pub fn new() -> Self {
Self {
traits: HashMap::new(),
}
}
pub fn register(&mut self, t: Box<dyn FactoryTrait<T>>) {
self.traits.insert(t.name().to_string(), t);
}
pub fn apply(&self, name: &str, entity: &mut T) -> crate::Result<()> {
match self.traits.get(name) {
Some(t) => {
t.apply(entity);
Ok(())
}
None => Err(crate::Error::TraitNotFound(format!(
"Trait '{}' not registered. Available: {:?}",
name,
self.traits.keys().collect::<Vec<_>>()
))),
}
}
pub fn has(&self, name: &str) -> bool {
self.traits.contains_key(name)
}
pub fn names(&self) -> Vec<&str> {
self.traits.keys().map(|s| s.as_str()).collect()
}
}
impl<T> Default for TraitRegistry<T> {
fn default() -> Self {
Self::new()
}
}