use std::sync::Arc;
use boson_core::{ExecutionContextFactory, QueueBackend};
use boson_telemetry::{ConsoleOpsLog, OpsLog};
use crate::registry::TaskRegistry;
use crate::Boson;
#[derive(Default)]
pub struct BosonBuilder {
pub(crate) queue_backend: Option<Arc<dyn QueueBackend>>,
pub(crate) execution_context_factory: Option<Arc<dyn ExecutionContextFactory>>,
pub(crate) ops_log: Option<Arc<dyn OpsLog>>,
pub(crate) registry: Option<Arc<TaskRegistry>>,
pub(crate) use_auto_registry: bool,
pub(crate) spawn_worker: bool,
pub(crate) worker_id: Option<String>,
pub(crate) lease_ttl_secs: Option<i64>,
pub(crate) runtime_label: Option<String>,
pub(crate) worker_pools: Option<Vec<String>>,
pub(crate) worker_poll_interval_ms: Option<u64>,
pub(crate) idempotency_mode: boson_core::IdempotencyMode,
}
impl BosonBuilder {
#[must_use]
pub fn worker_id(mut self, worker_id: impl Into<String>) -> Self {
self.worker_id = Some(worker_id.into());
self
}
#[must_use]
pub const fn lease_ttl_secs(mut self, secs: i64) -> Self {
self.lease_ttl_secs = Some(secs);
self
}
#[must_use]
pub fn runtime_label(mut self, label: impl Into<String>) -> Self {
self.runtime_label = Some(label.into());
self
}
#[must_use]
pub fn worker_pools(
mut self,
pools: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
self.worker_pools = Some(pools.into_iter().map(Into::into).collect());
self
}
#[must_use]
pub const fn worker_poll_interval_ms(mut self, ms: u64) -> Self {
self.worker_poll_interval_ms = Some(ms);
self
}
#[must_use]
pub const fn idempotency_mode(mut self, mode: boson_core::IdempotencyMode) -> Self {
self.idempotency_mode = mode;
self
}
#[must_use]
pub fn queue_backend(mut self, backend: Arc<dyn QueueBackend>) -> Self {
self.queue_backend = Some(backend);
self
}
#[must_use]
pub fn queue_backend_from_global(mut self) -> Self {
self.queue_backend = None;
self
}
#[must_use]
pub fn execution_context_factory(
mut self,
factory: impl ExecutionContextFactory + 'static,
) -> Self {
self.execution_context_factory = Some(Arc::new(factory));
self
}
#[must_use]
pub fn execution_context_factory_arc(
mut self,
factory: Arc<dyn ExecutionContextFactory>,
) -> Self {
self.execution_context_factory = Some(factory);
self
}
#[must_use]
pub fn ops_log(mut self, log: impl OpsLog + 'static) -> Self {
self.ops_log = Some(Arc::new(log));
self
}
#[must_use]
pub fn ops_log_console(mut self) -> Self {
self.ops_log = Some(Arc::new(ConsoleOpsLog));
self
}
#[must_use]
pub fn registry(mut self, registry: Arc<TaskRegistry>) -> Self {
self.registry = Some(registry);
self.use_auto_registry = false;
self
}
#[must_use]
pub const fn auto_registry(mut self) -> Self {
self.use_auto_registry = true;
self
}
#[must_use]
pub const fn without_worker(mut self) -> Self {
self.spawn_worker = false;
self
}
}
impl Boson {
#[must_use]
pub fn builder() -> BosonBuilder {
BosonBuilder {
spawn_worker: true,
..Default::default()
}
}
}