openapi_nexus/
generator_registry.rs1use std::collections::HashMap;
4
5use tracing::error;
6
7use openapi_nexus_common::GeneratorType;
8use openapi_nexus_core::CombinedGenerator;
9
10pub struct GeneratorRegistry {
12 generators: HashMap<GeneratorType, Box<dyn CombinedGenerator + Send + Sync>>,
13}
14
15impl GeneratorRegistry {
16 pub fn new() -> Self {
18 Self {
19 generators: HashMap::new(),
20 }
21 }
22
23 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 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 pub fn has_generator(&self, generator_type: GeneratorType) -> bool {
49 self.generators.contains_key(&generator_type)
50 }
51
52 pub fn registered_generators(&self) -> Vec<GeneratorType> {
54 self.generators.keys().cloned().collect()
55 }
56
57 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}