use std::{marker::PhantomData, time::Duration};
use crate::{manage::ManageConnection, pool::Pool};
#[derive(Clone, Copy, Debug)]
pub(crate) struct PoolConfig {
pub max_size: u32,
pub min_idle: u32,
pub connection_timeout: Duration,
pub idle_timeout: Option<Duration>,
pub max_lifetime: Option<Duration>,
pub test_on_check_out: bool,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
max_size: 10,
min_idle: 0,
connection_timeout: Duration::from_secs(30),
idle_timeout: Some(Duration::from_secs(10 * 60)),
max_lifetime: Some(Duration::from_secs(30 * 60)),
test_on_check_out: true,
}
}
}
pub struct Builder<M: ManageConnection> {
config: PoolConfig,
_marker: PhantomData<fn() -> M>,
}
impl<M: ManageConnection> Default for Builder<M> {
fn default() -> Self {
Self {
config: PoolConfig::default(),
_marker: PhantomData,
}
}
}
impl<M: ManageConnection> Builder<M> {
pub fn new() -> Self {
Self::default()
}
pub fn max_size(mut self, n: u32) -> Self {
self.config.max_size = n;
self
}
pub fn min_idle(mut self, n: u32) -> Self {
self.config.min_idle = n;
self
}
pub fn connection_timeout(mut self, d: Duration) -> Self {
self.config.connection_timeout = d;
self
}
pub fn idle_timeout(mut self, d: Option<Duration>) -> Self {
self.config.idle_timeout = d;
self
}
pub fn max_lifetime(mut self, d: Option<Duration>) -> Self {
self.config.max_lifetime = d;
self
}
pub fn test_on_check_out(mut self, yes: bool) -> Self {
self.config.test_on_check_out = yes;
self
}
pub fn build(self, manager: M) -> Pool<M> {
assert!(self.config.max_size > 0, "max_size must be at least 1");
let mut config = self.config;
config.min_idle = config.min_idle.min(config.max_size);
Pool::new(manager, config)
}
}