Skip to main content

camel_component_opensearch/
bundle.rs

1use std::sync::Arc;
2
3use camel_component_api::{CamelError, ComponentBundle, ComponentRegistrar};
4
5use crate::{OpenSearchComponent, OpenSearchsComponent, config::OpenSearchConfig};
6
7pub struct OpenSearchBundle {
8    config: OpenSearchConfig,
9}
10
11impl ComponentBundle for OpenSearchBundle {
12    fn config_key() -> &'static str {
13        "opensearch"
14    }
15
16    fn from_toml(value: toml::Value) -> Result<Self, CamelError> {
17        let config: OpenSearchConfig = value
18            .try_into()
19            .map_err(|e: toml::de::Error| CamelError::Config(e.to_string()))?;
20        Ok(Self { config })
21    }
22
23    fn register_all(self, ctx: &mut dyn ComponentRegistrar) {
24        ctx.register_component_dyn(Arc::new(OpenSearchComponent::with_config(
25            self.config.clone(),
26        )));
27        ctx.register_component_dyn(Arc::new(OpenSearchsComponent::with_config(self.config)));
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use camel_component_api::ComponentBundle;
35
36    struct TestRegistrar {
37        schemes: Vec<String>,
38    }
39
40    impl camel_component_api::ComponentRegistrar for TestRegistrar {
41        fn register_component_dyn(
42            &mut self,
43            component: std::sync::Arc<dyn camel_component_api::Component>,
44        ) {
45            self.schemes.push(component.scheme().to_string());
46        }
47    }
48
49    #[test]
50    fn opensearch_bundle_from_toml_empty_uses_defaults() {
51        let value: toml::Value = toml::from_str("").unwrap();
52        let result = OpenSearchBundle::from_toml(value);
53        assert!(
54            result.is_ok(),
55            "empty TOML must use defaults: {:?}",
56            result.err()
57        );
58    }
59
60    #[test]
61    fn opensearch_bundle_registers_expected_schemes() {
62        let bundle =
63            OpenSearchBundle::from_toml(toml::Value::Table(toml::map::Map::new())).unwrap();
64        let mut registrar = TestRegistrar { schemes: vec![] };
65
66        bundle.register_all(&mut registrar);
67
68        assert_eq!(registrar.schemes, vec!["opensearch", "opensearchs"]);
69    }
70
71    #[test]
72    fn opensearch_bundle_from_toml_returns_error_on_invalid_config() {
73        let mut table = toml::map::Map::new();
74        table.insert(
75            "port".to_string(),
76            toml::Value::String("not-a-number".to_string()),
77        );
78
79        let result = OpenSearchBundle::from_toml(toml::Value::Table(table));
80        assert!(result.is_err(), "expected Err on malformed config");
81        let err_msg = match result {
82            Err(err) => err.to_string(),
83            Ok(_) => panic!("expected Err on malformed config"),
84        };
85        assert!(
86            err_msg.contains("Configuration error"),
87            "expected CamelError::Config, got: {err_msg}"
88        );
89    }
90}