use std::{fmt, time::Duration};
use super::{
hooks::{Hook, Hooks},
Pool, PoolConfig, QueueMode, Timeouts,
};
#[derive(Copy, Clone, Debug)]
pub enum BuildError {
NoRuntimeSpecified,
}
impl fmt::Display for BuildError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NoRuntimeSpecified => {
f.write_str("Error occurred while building the pool: Timeouts require a runtime")
}
}
}
}
impl std::error::Error for BuildError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::NoRuntimeSpecified => None,
}
}
}
#[must_use = "builder does nothing itself, use `.build()` to build it"]
pub struct PoolBuilder {
pub(crate) manager: crate::Manager,
pub(crate) config: PoolConfig,
pub(crate) hooks: Hooks,
}
impl fmt::Debug for PoolBuilder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PoolBuilder")
.field("manager", &self.manager)
.field("config", &self.config)
.field("hooks", &self.hooks)
.finish()
}
}
impl PoolBuilder {
pub(crate) fn new(manager: crate::Manager) -> Self {
Self {
manager,
config: PoolConfig::default(),
hooks: Hooks::default(),
}
}
pub fn build(self) -> Result<Pool, BuildError> {
let t = &self.config.timeouts;
if t.wait.is_some() || t.create.is_some() || t.recycle.is_some() {
return Err(BuildError::NoRuntimeSpecified);
}
Ok(Pool::from_builder(self))
}
pub fn config(mut self, value: PoolConfig) -> Self {
self.config = value;
self
}
pub fn max_size(mut self, value: usize) -> Self {
self.config.max_size = value;
self
}
pub fn timeouts(mut self, value: Timeouts) -> Self {
self.config.timeouts = value;
self
}
pub fn wait_timeout(mut self, value: Option<Duration>) -> Self {
self.config.timeouts.wait = value;
self
}
pub fn create_timeout(mut self, value: Option<Duration>) -> Self {
self.config.timeouts.create = value;
self
}
pub fn recycle_timeout(mut self, value: Option<Duration>) -> Self {
self.config.timeouts.recycle = value;
self
}
pub fn queue_mode(mut self, value: QueueMode) -> Self {
self.config.queue_mode = value;
self
}
pub fn post_create(mut self, hook: impl Into<Hook>) -> Self {
self.hooks.post_create.push(hook.into());
self
}
pub fn pre_recycle(mut self, hook: impl Into<Hook>) -> Self {
self.hooks.pre_recycle.push(hook.into());
self
}
pub fn post_recycle(mut self, hook: impl Into<Hook>) -> Self {
self.hooks.post_recycle.push(hook.into());
self
}
}