use crate::error::InvalidStateError;
use crate::transport::Connection;
use super::runnable::RunnableServiceOrchestrator;
use super::OrchestratableServiceFactory;
const DEFAULT_INCOMING_CAPACITY: usize = 512;
const DEFAULT_OUTGOING_CAPACITY: usize = 512;
const DEFAULT_CHANNEL_CAPACITY: usize = 512;
#[derive(Default)]
pub struct ServiceOrchestratorBuilder {
connection: Option<Box<dyn Connection>>,
incoming_capacity: Option<usize>,
outgoing_capacity: Option<usize>,
channel_capacity: Option<usize>,
service_factories: Vec<Box<dyn OrchestratableServiceFactory>>,
}
impl ServiceOrchestratorBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_connection(mut self, connection: Box<dyn Connection>) -> Self {
self.connection = Some(connection);
self
}
pub fn with_incoming_capacity(mut self, incoming_capacity: usize) -> Self {
self.incoming_capacity = Some(incoming_capacity);
self
}
pub fn with_outgoing_capacity(mut self, outgoing_capacity: usize) -> Self {
self.outgoing_capacity = Some(outgoing_capacity);
self
}
pub fn with_channel_capacity(mut self, channel_capacity: usize) -> Self {
self.channel_capacity = Some(channel_capacity);
self
}
pub fn with_service_factory(
mut self,
service_factory: Box<dyn OrchestratableServiceFactory>,
) -> Self {
self.service_factories.push(service_factory);
self
}
pub fn build(self) -> Result<RunnableServiceOrchestrator, InvalidStateError> {
let connection = self.connection.ok_or_else(|| {
InvalidStateError::with_message("A service orchestrator requires a connection".into())
})?;
let incoming_capacity = self.incoming_capacity.unwrap_or(DEFAULT_INCOMING_CAPACITY);
let outgoing_capacity = self.outgoing_capacity.unwrap_or(DEFAULT_OUTGOING_CAPACITY);
let channel_capacity = self.channel_capacity.unwrap_or(DEFAULT_CHANNEL_CAPACITY);
let supported_service_types_vec = self
.service_factories
.iter()
.map(|factory| factory.available_service_types().to_vec())
.collect::<Vec<Vec<String>>>();
let mut supported_service_types = vec![];
for mut service_types in supported_service_types_vec {
supported_service_types.append(&mut service_types);
}
Ok(RunnableServiceOrchestrator {
connection,
service_factories: self.service_factories,
supported_service_types,
incoming_capacity,
outgoing_capacity,
channel_capacity,
})
}
}