Skip to main content

openapi_nexus/
generator_registry.rs

1//! Generator registry for managing code generators
2
3use std::collections::HashMap;
4
5use tracing::error;
6
7use openapi_nexus_common::GeneratorType;
8use openapi_nexus_core::CombinedGenerator;
9
10/// Registry for managing code generators
11pub struct GeneratorRegistry {
12    generators: HashMap<GeneratorType, Box<dyn CombinedGenerator + Send + Sync>>,
13}
14
15impl GeneratorRegistry {
16    /// Create a new empty generator registry
17    pub fn new() -> Self {
18        Self {
19            generators: HashMap::new(),
20        }
21    }
22
23    /// Register a generator, logging an error and skipping if already registered.
24    pub fn register_generator<G>(&mut self, generator_type: GeneratorType, generator: G)
25    where
26        G: CombinedGenerator + Send + Sync + 'static,
27    {
28        if self.generators.contains_key(&generator_type) {
29            error!(
30                "Generator '{}' is already registered, skipping registration.",
31                generator_type
32            );
33            return;
34        }
35
36        self.generators.insert(generator_type, Box::new(generator));
37    }
38
39    /// Get a generator for a specific generator type
40    pub fn get_generator(
41        &self,
42        generator_type: GeneratorType,
43    ) -> Option<&(dyn CombinedGenerator + Send + Sync)> {
44        self.generators.get(&generator_type).map(|g| g.as_ref())
45    }
46
47    /// Check if a generator is registered
48    pub fn has_generator(&self, generator_type: GeneratorType) -> bool {
49        self.generators.contains_key(&generator_type)
50    }
51
52    /// Get all registered generators
53    pub fn registered_generators(&self) -> Vec<GeneratorType> {
54        self.generators.keys().cloned().collect()
55    }
56
57    /// Get the number of registered generators
58    pub fn count(&self) -> usize {
59        self.generators.len()
60    }
61}
62
63impl Default for GeneratorRegistry {
64    fn default() -> Self {
65        Self::new()
66    }
67}