use std::sync::Arc;
use camel_api::{BoxProcessor, EndpointResolver, ProducerContext};
use camel_component_api::{ComponentContext, RuntimeObservability};
use camel_endpoint::parse_uri;
pub fn make_endpoint_resolver(
component_ctx: Arc<dyn ComponentContext>,
rt: Arc<dyn RuntimeObservability>,
producer_ctx: ProducerContext,
) -> EndpointResolver {
Arc::new(move |uri: &str| {
let parsed = match parse_uri(uri) {
Ok(p) => p,
Err(_) => return None,
};
let component = match component_ctx.resolve_component(&parsed.scheme) {
Some(c) => c,
None => return None,
};
let endpoint = match component.create_endpoint(uri, component_ctx.as_ref()) {
Ok(e) => e,
Err(_) => return None,
};
let producer = match endpoint.create_producer(Arc::clone(&rt), &producer_ctx) {
Ok(p) => p,
Err(_) => return None,
};
Some(BoxProcessor::new(producer))
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn make_endpoint_resolver_unknown_scheme_returns_none() {
let component_ctx: Arc<dyn ComponentContext> =
Arc::new(camel_component_api::NoOpComponentContext);
let rt: Arc<dyn RuntimeObservability> = Arc::new(camel_component_api::NoOpComponentContext);
let producer_ctx = ProducerContext::new();
let resolver = make_endpoint_resolver(component_ctx, rt, producer_ctx);
let result = resolver("unknown://test");
assert!(result.is_none());
}
}