use crate::config::AppConfig; use crate::error::{AppError, AppResult}; impl AppConfig { pub fn redis_url(&self) -> AppResult> { self.get_env::("APP_REDIS_URL") } pub fn redis_cluster_enabled(&self) -> AppResult { self.get_env_or("APP_REDIS_CLUSTER_ENABLED", false) } pub fn redis_cluster_nodes(&self) -> AppResult> { match self.get_env::("APP_REDIS_CLUSTER_NODES")? { 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 redis_read_from_replicas(&self) -> AppResult { self.get_env_or("APP_REDIS_READ_FROM_REPLICAS", false) } pub fn redis_username(&self) -> AppResult> { self.get_env::("APP_REDIS_USERNAME") } pub fn redis_password(&self) -> AppResult> { self.get_env::("APP_REDIS_PASSWORD") } pub fn redis_database(&self) -> AppResult { self.get_env_or("APP_REDIS_DATABASE", 0u8) } pub fn redis_max_connections(&self) -> AppResult { self.get_env_or("APP_REDIS_MAX_CONNECTIONS", 20) } pub fn redis_min_connections(&self) -> AppResult { self.get_env_or("APP_REDIS_MIN_CONNECTIONS", 2) } pub fn redis_idle_timeout(&self) -> AppResult { self.get_env_or("APP_REDIS_IDLE_TIMEOUT", 300) } pub fn redis_connection_timeout(&self) -> AppResult { self.get_env_or("APP_REDIS_CONNECTION_TIMEOUT", 5) } pub fn redis_max_retries(&self) -> AppResult { self.get_env_or("APP_REDIS_MAX_RETRIES", 3) } pub fn redis_retry_delay_ms(&self) -> AppResult { self.get_env_or("APP_REDIS_RETRY_DELAY_MS", 100) } pub fn redis_tls_enabled(&self) -> AppResult { self.get_env_or("APP_REDIS_TLS_ENABLED", false) } pub fn redis_key_prefix(&self) -> AppResult { self.get_env_or("APP_REDIS_KEY_PREFIX", "".to_string()) } pub fn redis_validate(&self) -> AppResult<()> { if self.redis_cluster_enabled()? { let nodes = self.redis_cluster_nodes()?; if nodes.is_empty() { return Err(AppError::Config( "Redis cluster enabled but APP_REDIS_CLUSTER_NODES is empty".into(), )); } } else if self.redis_url()?.is_none() { return Err(AppError::Config( "Redis cluster disabled but APP_REDIS_URL is not set".into(), )); } Ok(()) } }