Skip to main content

doido_generators/
registry.rs

1use crate::generator::{GeneratedFile, Generator};
2use doido_core::Result;
3use std::collections::HashMap;
4
5pub struct GeneratorRegistry {
6    generators: HashMap<String, Box<dyn Generator>>,
7}
8
9impl GeneratorRegistry {
10    pub fn new() -> Self {
11        Self {
12            generators: HashMap::new(),
13        }
14    }
15
16    pub fn register(&mut self, generator: Box<dyn Generator>) {
17        self.generators
18            .insert(generator.name().to_string(), generator);
19    }
20
21    pub fn run(&self, name: &str, args: &[&str]) -> Result<Vec<GeneratedFile>> {
22        let gen = self
23            .generators
24            .get(name)
25            .ok_or_else(|| doido_core::anyhow::anyhow!("generator '{}' not found", name))?;
26        gen.generate(args)
27    }
28
29    pub fn list(&self) -> Vec<&str> {
30        let mut names: Vec<&str> = self.generators.keys().map(|s| s.as_str()).collect();
31        names.sort();
32        names
33    }
34}
35
36impl Default for GeneratorRegistry {
37    fn default() -> Self {
38        Self::new()
39    }
40}