use std::env;
#[derive(Debug, Clone)]
pub struct AppConfig {
pub host: String,
pub port: u16,
pub database_url: String,
pub db_max_connections: u32,
pub db_min_connections: u32,
pub db_connect_timeout: u64,
pub db_idle_timeout: u64,
pub db_max_lifetime: u64,
}
impl AppConfig {
pub fn from_env() -> anyhow::Result<Self> {
let host = env::var("APP_HOST").unwrap_or_else(|_| "0.0.0.0".to_string());
let port = env::var("APP_PORT")
.unwrap_or_else(|_| "3000".to_string())
.parse::<u16>()?;
let database_url =
env::var("DATABASE_URL").map_err(|_| anyhow::anyhow!("DATABASE_URL must be set"))?;
let db_max_connections = env::var("DB_MAX_CONNECTIONS")
.unwrap_or_else(|_| "100".to_string())
.parse::<u32>()?;
let db_min_connections = env::var("DB_MIN_CONNECTIONS")
.unwrap_or_else(|_| "5".to_string())
.parse::<u32>()?;
let db_connect_timeout = env::var("DB_CONNECT_TIMEOUT")
.unwrap_or_else(|_| "8".to_string())
.parse::<u64>()?;
let db_idle_timeout = env::var("DB_IDLE_TIMEOUT")
.unwrap_or_else(|_| "600".to_string())
.parse::<u64>()?;
let db_max_lifetime = env::var("DB_MAX_LIFETIME")
.unwrap_or_else(|_| "1800".to_string())
.parse::<u64>()?;
Ok(Self {
host,
port,
database_url,
db_max_connections,
db_min_connections,
db_connect_timeout,
db_idle_timeout,
db_max_lifetime,
})
}
pub fn bind_address(&self) -> String {
format!("{}:{}", self.host, self.port)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn default_config() -> AppConfig {
AppConfig {
host: "127.0.0.1".to_string(),
port: 8080,
database_url: "postgres://localhost/test".to_string(),
db_max_connections: 100,
db_min_connections: 5,
db_connect_timeout: 8,
db_idle_timeout: 600,
db_max_lifetime: 1800,
}
}
#[test]
fn test_bind_address() {
let config = default_config();
assert_eq!(config.bind_address(), "127.0.0.1:8080");
}
#[test]
fn test_bind_address_default_format() {
let mut config = default_config();
config.host = "0.0.0.0".to_string();
config.port = 3000;
assert_eq!(config.bind_address(), "0.0.0.0:3000");
}
#[test]
fn test_config_clone() {
let config = default_config();
let cloned = config.clone();
assert_eq!(config.host, cloned.host);
assert_eq!(config.port, cloned.port);
assert_eq!(config.database_url, cloned.database_url);
assert_eq!(config.db_max_connections, cloned.db_max_connections);
}
}