use std::time::Duration;
use crate::error::{ConfigError, EventBusError};
use crate::types::{BusConfig, SubscriptionPolicy};
use super::EventBus;
pub struct EventBusBuilder {
config: BusConfig,
}
impl std::fmt::Debug for EventBusBuilder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("EventBusBuilder").field("config", &self.config).finish()
}
}
impl EventBusBuilder {
pub(super) fn new() -> Self {
Self {
config: BusConfig::default(),
}
}
pub fn buffer_size(mut self, size: usize) -> Self {
self.config.buffer_size = size;
self
}
pub fn handler_timeout(mut self, timeout: Duration) -> Self {
self.config.handler_timeout = Some(timeout);
self
}
pub fn max_concurrent_async(mut self, max: usize) -> Self {
self.config.max_concurrent_async = Some(max);
self
}
pub fn default_subscription_policy(mut self, policy: SubscriptionPolicy) -> Self {
self.config.default_subscription_policy = policy;
self
}
#[deprecated(since = "0.3.3", note = "renamed to default_subscription_policy")]
pub fn default_failure_policy(self, policy: SubscriptionPolicy) -> Self {
self.default_subscription_policy(policy)
}
pub fn shutdown_timeout(mut self, timeout: Duration) -> Self {
self.config.shutdown_timeout = Some(timeout);
self
}
pub fn build(self) -> Result<EventBus, EventBusError> {
if self.config.buffer_size == 0 {
return Err(ConfigError::ZeroBufferSize.into());
}
if self.config.max_concurrent_async == Some(0) {
return Err(ConfigError::ZeroConcurrency.into());
}
Ok(EventBus::from_config(self.config))
}
}