use std::sync::Arc;
use crate::error::{Error, Result};
use crate::executor::Pool;
use crate::executor::metric_sink::{MetricSink, NoopMetricSink};
use crate::executor::panic_handler::{NoopPanicHandler, PanicHandler};
use crate::policy::RejectPolicy;
#[derive(Clone)]
pub struct PoolBuilder {
pub(crate) workers: usize,
pub(crate) queue_capacity: usize,
pub(crate) reject_policy: RejectPolicy,
pub(crate) panic_handler: Arc<dyn PanicHandler>,
pub(crate) metric_sink: Arc<dyn MetricSink>,
}
impl Default for PoolBuilder {
fn default() -> Self {
Self {
workers: std::thread::available_parallelism()
.map(usize::from)
.unwrap_or(1),
queue_capacity: 100_000,
reject_policy: RejectPolicy::Reject,
panic_handler: Arc::new(NoopPanicHandler),
metric_sink: Arc::new(NoopMetricSink),
}
}
}
impl PoolBuilder {
pub fn workers(mut self, workers: usize) -> Self {
self.workers = workers;
self
}
pub fn queue_capacity(mut self, queue_capacity: usize) -> Self {
self.queue_capacity = queue_capacity;
self
}
pub fn reject_policy(mut self, reject_policy: RejectPolicy) -> Self {
self.reject_policy = reject_policy;
self
}
pub fn panic_handler<H>(mut self, panic_handler: H) -> Self
where
H: PanicHandler,
{
self.panic_handler = Arc::new(panic_handler);
self
}
pub fn metric_sink<S>(mut self, metric_sink: S) -> Self
where
S: MetricSink,
{
self.metric_sink = Arc::new(metric_sink);
self
}
pub fn build(self) -> Result<Pool> {
if self.workers == 0 {
return Err(Error::InvalidConfig("workers must be greater than zero"));
}
if self.queue_capacity == 0 {
return Err(Error::InvalidConfig(
"queue_capacity must be greater than zero",
));
}
Pool::new(self)
}
}