use crate::error::InvalidStateError;
use crate::service::Service;
use crate::transport::Connection;
use super::ServiceProcessor;
const DEFAULT_INCOMING_CAPACITY: usize = 8;
const DEFAULT_OUTGOING_CAPACITY: usize = 8;
const DEFAULT_CHANNEL_CAPACITY: usize = 8;
#[derive(Default)]
pub struct ServiceProcessorBuilder {
connection: Option<Box<dyn Connection>>,
circuit: Option<String>,
incoming_capacity: Option<usize>,
outgoing_capacity: Option<usize>,
channel_capacity: Option<usize>,
services: Vec<Box<dyn Service>>,
}
impl ServiceProcessorBuilder {
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_circuit(mut self, circuit: String) -> Self {
self.circuit = Some(circuit);
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(mut self, service: Box<dyn Service>) -> Self {
self.services.push(service);
self
}
pub fn build(self) -> Result<ServiceProcessor, InvalidStateError> {
let connection = self.connection.ok_or_else(|| {
InvalidStateError::with_message("A service processor requires a connection".into())
})?;
let circuit = self.circuit.ok_or_else(|| {
InvalidStateError::with_message("A service processor requires a circuit".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);
if self.services.is_empty() {
return Err(InvalidStateError::with_message(
"At least one service is required by a service processor".into(),
));
}
let mut processor = ServiceProcessor::new(
connection,
circuit,
incoming_capacity,
outgoing_capacity,
channel_capacity,
)
.map_err(|e| InvalidStateError::with_message(e.to_string()))?;
for service in self.services.into_iter() {
processor
.add_service(service)
.map_err(|e| InvalidStateError::with_message(e.to_string()))?;
}
Ok(processor)
}
}