Skip to main content

camel_component_wasm/
bundle.rs

1use std::path::PathBuf;
2use std::sync::Arc;
3
4use camel_component_api::{CamelError, ComponentBundle, ComponentRegistrar};
5use camel_core::Registry;
6
7use crate::WasmComponent;
8
9pub struct WasmBundle {
10    registry: Arc<std::sync::Mutex<Registry>>,
11    base_dir: PathBuf,
12}
13
14impl WasmBundle {
15    pub fn new(registry: Arc<std::sync::Mutex<Registry>>, base_dir: PathBuf) -> Self {
16        Self { registry, base_dir }
17    }
18}
19
20impl ComponentBundle for WasmBundle {
21    fn config_key() -> &'static str {
22        "wasm"
23    }
24
25    fn from_toml(_value: toml::Value) -> Result<Self, CamelError> {
26        Err(CamelError::Config(
27            "WasmBundle requires registry and base_dir — use WasmBundle::new() instead".to_string(),
28        ))
29    }
30
31    fn register_all(self, ctx: &mut dyn ComponentRegistrar) {
32        let component = WasmComponent::new(self.registry, self.base_dir);
33        ctx.register_component_dyn(Arc::new(component));
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use camel_core::Registry;
41
42    struct TestRegistrar {
43        schemes: Vec<String>,
44    }
45
46    impl ComponentRegistrar for TestRegistrar {
47        fn register_component_dyn(&mut self, component: Arc<dyn camel_component_api::Component>) {
48            self.schemes.push(component.scheme().to_string());
49        }
50    }
51
52    #[test]
53    fn wasm_bundle_from_toml_returns_error() {
54        let value: toml::Value = toml::from_str("").unwrap();
55        let result = WasmBundle::from_toml(value);
56        assert!(result.is_err());
57    }
58
59    #[test]
60    fn wasm_bundle_registers_wasm_scheme() {
61        let registry = Arc::new(std::sync::Mutex::new(Registry::new()));
62        let bundle = WasmBundle::new(registry, PathBuf::from("."));
63        let mut registrar = TestRegistrar { schemes: vec![] };
64
65        bundle.register_all(&mut registrar);
66
67        assert_eq!(registrar.schemes, vec!["wasm"]);
68    }
69}