doido_generators/
registry.rs1use 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}