use std::{fmt, time::Duration};
use super::BuildError;
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct PoolConfig {
pub max_size: usize,
#[cfg_attr(feature = "serde", serde(default))]
pub timeouts: Timeouts,
#[cfg_attr(feature = "serde", serde(default))]
pub queue_mode: QueueMode,
}
impl PoolConfig {
#[must_use]
pub fn new(max_size: usize) -> Self {
Self {
max_size,
timeouts: Timeouts::default(),
queue_mode: QueueMode::default(),
}
}
}
impl Default for PoolConfig {
fn default() -> Self {
Self::new(crate::util::get_default_pool_max_size())
}
}
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Timeouts {
pub wait: Option<Duration>,
pub create: Option<Duration>,
pub recycle: Option<Duration>,
}
impl Timeouts {
#[must_use]
pub const fn new() -> Self {
Self {
create: None,
wait: None,
recycle: None,
}
}
#[must_use]
pub const fn wait_millis(wait: u64) -> Self {
Self {
create: None,
wait: Some(Duration::from_millis(wait)),
recycle: None,
}
}
}
impl Default for Timeouts {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug, Default)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum QueueMode {
#[default]
Fifo,
Lifo,
}
#[derive(Debug)]
pub enum CreatePoolError<C> {
Config(C),
Build(BuildError),
}
impl<C> fmt::Display for CreatePoolError<C>
where
C: fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Config(e) => write!(f, "Config: {}", e),
Self::Build(e) => write!(f, "Build: {}", e),
}
}
}
impl<C> std::error::Error for CreatePoolError<C> where C: std::error::Error {}