use crate::env::Environment;
use crate::{env_bool, env_parsable};
use anyhow::{Context, Result};
use std::env;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct DbConfig {
pub database_url: String,
pub min_connections: u32,
pub max_connections: u32,
pub acquire_timeout: Duration,
pub idle_timeout: Duration,
pub test_before_acquire: bool,
}
impl DbConfig {
pub fn init_for(env: &Environment) -> Result<Self> {
let url = env::var("DATABASE_URL").context("DATABASE_URL must be set")?;
let database_url = if *env == Environment::Test && !url.ends_with("_test") && !url.contains('?') {
format!("{url}_test")
} else {
url
};
let min_connections = env_parsable::<u32>("MIN_CONNECTIONS", 1)?;
let max_connections = env_parsable::<u32>("MAX_CONNECTIONS", 10)?;
let acquire_timeout = Duration::from_millis(env_parsable::<u64>("ACQUIRE_TIMEOUT_MS", 750)?);
let idle_timeout = Duration::from_secs(env_parsable::<u64>("IDLE_TIMEOUT_SEC", 300)?);
let test_before_acquire = env_bool("TEST_BEFORE_ACQUIRE", false)?;
Ok(DbConfig {
database_url,
min_connections,
max_connections,
acquire_timeout,
idle_timeout,
test_before_acquire,
})
}
}
impl ToString for DbConfig {
fn to_string(&self) -> String {
format!(
r#"DATABASE_URL="{}"
MIN_CONNECTIONS={}
MAX_CONNECTIONS={}
ACQUIRE_TIMEOUT_MS={}
IDLE_TIMEOUT_SEC={}
TEST_BEFORE_ACQUIRE={}"#,
self.database_url,
self.min_connections,
self.max_connections,
self.acquire_timeout.as_millis(),
self.idle_timeout.as_secs(),
self.test_before_acquire,
)
}
}