use std::env;
use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PoolSettings {
pub max_connections: u32,
pub min_connections: u32,
pub acquire_timeout: Duration,
pub idle_timeout: Duration,
pub max_lifetime: Duration,
}
impl Default for PoolSettings {
fn default() -> Self {
Self {
max_connections: 50,
min_connections: 5,
acquire_timeout: Duration::from_secs(30),
idle_timeout: Duration::from_secs(600),
max_lifetime: Duration::from_secs(1800),
}
}
}
impl PoolSettings {
pub fn from_env() -> Self {
let defaults = Self::default();
Self {
max_connections: count("DATABASE_POOL_MAX_CONNECTIONS", defaults.max_connections),
min_connections: count("DATABASE_POOL_MIN_CONNECTIONS", defaults.min_connections),
acquire_timeout: seconds(
"DATABASE_POOL_ACQUIRE_TIMEOUT_SECS",
defaults.acquire_timeout,
),
idle_timeout: seconds("DATABASE_POOL_IDLE_TIMEOUT_SECS", defaults.idle_timeout),
max_lifetime: seconds("DATABASE_POOL_MAX_LIFETIME_SECS", defaults.max_lifetime),
}
}
}
fn count(key: &str, default: u32) -> u32 {
env::var(key)
.ok()
.and_then(|value| value.trim().parse().ok())
.unwrap_or(default)
}
fn seconds(key: &str, default: Duration) -> Duration {
env::var(key)
.ok()
.and_then(|value| value.trim().parse().ok())
.map(Duration::from_secs)
.unwrap_or(default)
}