use crate::config::AppConfig; use crate::error::{AppError, AppResult}; impl AppConfig { pub fn database_url(&self) -> AppResult { if let Some(url) = self.get_env::("APP_DATABASE_URL")? { return Ok(url); } if let Some(url) = self.get_env::("DATABASE_URL")? { return Ok(url); } Err(AppError::Config( "Neither APP_DATABASE_URL nor DATABASE_URL is set".into(), )) } pub fn database_max_connections(&self) -> AppResult { self.get_env_or("APP_DATABASE_MAX_CONNECTIONS", 10) } pub fn database_min_connections(&self) -> AppResult { self.get_env_or("APP_DATABASE_MIN_CONNECTIONS", 2) } pub fn database_idle_timeout(&self) -> AppResult { self.get_env_or("APP_DATABASE_IDLE_TIMEOUT", 600) } pub fn database_max_lifetime(&self) -> AppResult { self.get_env_or("APP_DATABASE_MAX_LIFETIME", 3600) } pub fn database_connection_timeout(&self) -> AppResult { self.get_env_or("APP_DATABASE_CONNECTION_TIMEOUT", 8) } pub fn database_schema_search_path(&self) -> AppResult { self.get_env_or("APP_DATABASE_SCHEMA_SEARCH_PATH", "public".to_string()) } pub fn database_read_write_split(&self) -> AppResult { self.get_env_or("APP_DATABASE_READ_WRITE_SPLIT", false) } pub fn database_read_replicas(&self) -> AppResult> { match self.get_env::("APP_DATABASE_REPLICAS")? { Some(s) if !s.is_empty() => Ok(s .split(',') .map(|u| u.trim().to_string()) .filter(|u| !u.is_empty()) .collect()), _ => Ok(Vec::new()), } } pub fn database_replica_max_connections(&self) -> AppResult { self.get_env_or("APP_DATABASE_REPLICA_MAX_CONNECTIONS", 10) } pub fn database_replica_min_connections(&self) -> AppResult { self.get_env_or("APP_DATABASE_REPLICA_MIN_CONNECTIONS", 2) } pub fn database_replica_idle_timeout(&self) -> AppResult { self.get_env_or("APP_DATABASE_REPLICA_IDLE_TIMEOUT", 600) } pub fn database_replica_max_lifetime(&self) -> AppResult { self.get_env_or("APP_DATABASE_REPLICA_MAX_LIFETIME", 3600) } pub fn database_replica_connection_timeout(&self) -> AppResult { self.get_env_or("APP_DATABASE_REPLICA_CONNECTION_TIMEOUT", 8) } pub fn database_health_check_interval(&self) -> AppResult { self.get_env_or("APP_DATABASE_HEALTH_CHECK_INTERVAL", 30) } pub fn database_retry_attempts(&self) -> AppResult { self.get_env_or("APP_DATABASE_RETRY_ATTEMPTS", 3) } pub fn database_retry_delay(&self) -> AppResult { self.get_env_or("APP_DATABASE_RETRY_DELAY", 5) } }