use std::collections::HashMap;
use tracing::error;
use crate::codegen::CombinedGenerator;
use crate::codegen::GeneratorType;
pub struct GeneratorRegistry {
generators: HashMap<GeneratorType, Box<dyn CombinedGenerator + Send + Sync>>,
}
impl GeneratorRegistry {
pub fn new() -> Self {
Self {
generators: HashMap::new(),
}
}
pub fn register_generator<G>(&mut self, generator_type: GeneratorType, generator: G)
where
G: CombinedGenerator + Send + Sync + 'static,
{
if self.generators.contains_key(&generator_type) {
error!(
"Generator '{}' is already registered, skipping registration.",
generator_type
);
return;
}
self.generators.insert(generator_type, Box::new(generator));
}
pub fn get_generator(
&self,
generator_type: GeneratorType,
) -> Option<&(dyn CombinedGenerator + Send + Sync)> {
self.generators.get(&generator_type).map(|g| g.as_ref())
}
pub fn has_generator(&self, generator_type: GeneratorType) -> bool {
self.generators.contains_key(&generator_type)
}
pub fn registered_generators(&self) -> Vec<GeneratorType> {
self.generators.keys().cloned().collect()
}
pub fn count(&self) -> usize {
self.generators.len()
}
}
impl Default for GeneratorRegistry {
fn default() -> Self {
Self::new()
}
}