pub mod core;
pub mod eips_extra;
pub mod errors;
pub mod routing;
pub mod saga;
pub mod transform;
use std::any::Any;
use std::collections::BTreeMap;
use crate::context::CamelContext;
use crate::error::Result;
use crate::model::RouteDefinition;
pub type DefinitionCustomizer = Box<dyn Fn(&mut RouteDefinition) + Send + Sync>;
pub struct RouteBuilder {
ctx: CamelContext,
routes: Vec<RouteDefinition>,
pub extensions: BTreeMap<String, Box<dyn Any + Send + Sync>>,
pub customizers: Vec<DefinitionCustomizer>,
pub generators: Vec<Box<dyn FnOnce(&CamelContext) -> Result<Vec<RouteDefinition>> + Send>>,
}
impl RouteBuilder {
pub fn new(ctx: CamelContext) -> Self {
RouteBuilder { ctx, routes: Vec::new(), extensions: BTreeMap::new(), customizers: Vec::new(), generators: Vec::new() }
}
pub fn context(&self) -> &CamelContext {
&self.ctx
}
pub fn from(&mut self, uri: impl Into<String>) -> &mut RouteDefinition {
self.routes.push(RouteDefinition::new(uri));
self.routes.last_mut().unwrap()
}
pub fn add_route(&mut self, def: RouteDefinition) {
self.routes.push(def);
}
pub fn routes(&self) -> &[RouteDefinition] {
&self.routes
}
pub fn routes_mut(&mut self) -> &mut Vec<RouteDefinition> {
&mut self.routes
}
pub fn extension_mut<T: Any + Send + Sync + Default>(&mut self, key: &str) -> &mut T {
if !self.extensions.get(key).map(|b| b.is::<T>()).unwrap_or(false) {
self.extensions.insert(key.to_string(), Box::new(T::default()));
}
self.extensions.get_mut(key).unwrap().downcast_mut::<T>().unwrap()
}
pub fn into_definitions(self) -> Result<Vec<RouteDefinition>> {
let RouteBuilder { ctx, mut routes, customizers, generators, .. } = self;
for g in generators {
routes.extend(g(&ctx)?);
}
for r in routes.iter_mut() {
r.finish()?;
for c in &customizers {
c(r);
}
}
Ok(routes)
}
}