camel_core/shared/components/domain/
registry.rs1use std::collections::HashMap;
2
3use camel_api::CamelError;
4use camel_component_api::Component;
5
6pub struct Registry {
8 components: HashMap<String, Box<dyn Component>>,
9}
10
11impl Registry {
12 pub fn new() -> Self {
14 Self {
15 components: HashMap::new(),
16 }
17 }
18
19 pub fn register<C: Component + 'static>(&mut self, component: C) {
21 self.components
22 .insert(component.scheme().to_string(), Box::new(component));
23 }
24
25 pub fn get(&self, scheme: &str) -> Option<&dyn Component> {
27 self.components.get(scheme).map(|c| c.as_ref())
28 }
29
30 pub fn get_or_err(&self, scheme: &str) -> Result<&dyn Component, CamelError> {
32 self.get(scheme)
33 .ok_or_else(|| CamelError::ComponentNotFound(scheme.to_string()))
34 }
35
36 pub fn len(&self) -> usize {
38 self.components.len()
39 }
40
41 pub fn is_empty(&self) -> bool {
43 self.components.is_empty()
44 }
45}
46
47impl Default for Registry {
48 fn default() -> Self {
49 Self::new()
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56 use camel_component_log::LogComponent;
57 use camel_component_timer::TimerComponent;
58
59 #[test]
60 fn registry_starts_empty() {
61 let registry = Registry::new();
62 assert!(registry.is_empty());
63 assert_eq!(registry.len(), 0);
64 assert!(registry.get("timer").is_none());
65 }
66
67 #[test]
68 fn registry_registers_and_gets_components() {
69 let mut registry = Registry::new();
70 registry.register(TimerComponent::new());
71 registry.register(LogComponent::new());
72
73 assert_eq!(registry.len(), 2);
74 assert!(registry.get("timer").is_some());
75 assert!(registry.get("log").is_some());
76 assert!(!registry.is_empty());
77 }
78
79 #[test]
80 fn registry_get_or_err_reports_missing_component() {
81 let mut registry = Registry::new();
82 registry.register(TimerComponent::new());
83
84 let err = match registry.get_or_err("missing") {
85 Ok(_) => panic!("must fail"),
86 Err(err) => err,
87 };
88 assert!(matches!(err, CamelError::ComponentNotFound(_)));
89 }
90
91 #[test]
92 fn registry_replaces_component_with_same_scheme() {
93 let mut registry = Registry::new();
94 registry.register(TimerComponent::new());
95 registry.register(TimerComponent::new());
96
97 assert_eq!(registry.len(), 1);
98 assert!(registry.get("timer").is_some());
99 }
100}