use std::time::Duration; use crate::AppConfig; impl AppConfig { pub fn cache_local_max_capacity(&self) -> anyhow::Result { self.parse_env("APP_CACHE_LOCAL_MAX_CAPACITY", 10_000) } pub fn cache_local_ttl(&self) -> anyhow::Result> { self.parse_optional_duration_secs( "APP_CACHE_LOCAL_TTL_SECONDS", Some(300), ) } pub fn cache_local_tti(&self) -> anyhow::Result> { self.parse_optional_duration_secs("APP_CACHE_LOCAL_TTI_SECONDS", None) } pub fn cache_default_ttl(&self) -> anyhow::Result> { self.parse_optional_duration_secs( "APP_CACHE_DEFAULT_TTL_SECONDS", Some(300), ) } pub fn cache_cluster_enabled(&self) -> anyhow::Result { self.parse_env("APP_CACHE_CLUSTER_ENABLED", false) } pub fn cache_cluster_key_prefix(&self) -> Option { self.env .get("APP_CACHE_CLUSTER_KEY_PREFIX") .map(|value| value.trim().to_string()) .filter(|value| !value.is_empty()) } pub fn cache_cluster_command_timeout(&self) -> anyhow::Result { self.parse_duration_secs("APP_CACHE_CLUSTER_COMMAND_TIMEOUT_SECONDS", 3) } pub fn cache_cluster_write_through(&self) -> anyhow::Result { self.parse_env("APP_CACHE_CLUSTER_WRITE_THROUGH", true) } pub fn parse_env(&self, key: &str, default: T) -> anyhow::Result where T: std::str::FromStr, T::Err: std::error::Error + Send + Sync + 'static, { match self.env.get(key).map(|value| value.trim()) { Some(value) if !value.is_empty() => Ok(value.parse::()?), _ => Ok(default), } } pub fn parse_duration_secs( &self, key: &str, default_secs: u64, ) -> anyhow::Result { Ok(Duration::from_secs(self.parse_env(key, default_secs)?)) } pub fn parse_optional_duration_secs( &self, key: &str, default_secs: Option, ) -> anyhow::Result> { match self.env.get(key).map(|value| value.trim()) { Some("0") => Ok(None), Some(value) if !value.is_empty() => { Ok(Some(Duration::from_secs(value.parse()?))) } _ => Ok(default_secs.map(Duration::from_secs)), } } }