Skip to main content

camel_component_api/
component_context.rs

1use std::sync::Arc;
2
3use camel_api::{AsyncHealthCheck, MetricsCollector, PlatformService};
4use camel_language_api::Language;
5
6use crate::Component;
7
8/// Runtime context passed to components during endpoint creation.
9pub trait ComponentContext: Send + Sync {
10    /// Resolve a component by scheme.
11    fn resolve_component(&self, scheme: &str) -> Option<Arc<dyn Component>>;
12
13    /// Resolve a language by name.
14    fn resolve_language(&self, name: &str) -> Option<Arc<dyn Language>>;
15
16    /// Access the active metrics collector.
17    fn metrics(&self) -> Arc<dyn MetricsCollector>;
18
19    /// Access the active platform service.
20    fn platform_service(&self) -> Arc<dyn PlatformService>;
21
22    fn register_route_health_check(&self, route_id: &str, check: Arc<dyn AsyncHealthCheck>);
23
24    fn unregister_route_health_check(&self, route_id: &str);
25
26    fn route_id(&self) -> Option<&str> {
27        None
28    }
29
30    fn register_current_route_health_check(&self, check: Arc<dyn AsyncHealthCheck>) {
31        if let Some(id) = self.route_id() {
32            self.register_route_health_check(id, check);
33        }
34    }
35}
36
37/// Default no-op component context for tests/examples.
38pub struct NoOpComponentContext;
39
40impl ComponentContext for NoOpComponentContext {
41    fn resolve_component(&self, _scheme: &str) -> Option<Arc<dyn Component>> {
42        None
43    }
44
45    fn resolve_language(&self, _name: &str) -> Option<Arc<dyn Language>> {
46        None
47    }
48
49    fn metrics(&self) -> Arc<dyn MetricsCollector> {
50        Arc::new(camel_api::NoOpMetrics)
51    }
52
53    fn platform_service(&self) -> Arc<dyn PlatformService> {
54        Arc::new(camel_api::NoopPlatformService::default())
55    }
56
57    fn register_route_health_check(&self, _route_id: &str, _check: Arc<dyn AsyncHealthCheck>) {}
58
59    fn unregister_route_health_check(&self, _route_id: &str) {}
60}