use crate::error::ConfigError; use super::INJECTED_VARS; pub(crate) fn optional_env(key: &str) -> Result, ConfigError> { // Check real env vars first (always win over injected secrets) match std::env::var(key) { Ok(val) if val.is_empty() => {} Ok(val) => return Ok(Some(val)), Err(std::env::VarError::NotPresent) => {} Err(e) => { return Err(ConfigError::ParseError(format!( "failed to read {key}: {e}" ))); } } // Fall back to thread-safe overlay (secrets injected from DB) if let Some(val) = INJECTED_VARS.get().and_then(|map| map.get(key)) { return Ok(Some(val.clone())); } Ok(None) } pub(crate) fn parse_optional_env(key: &str, default: T) -> Result where T: std::str::FromStr, T::Err: std::fmt::Display, { optional_env(key)? .map(|s| { s.parse().map_err(|e| ConfigError::InvalidValue { key: key.to_string(), message: format!("{e}"), }) }) .transpose() .map(|opt| opt.unwrap_or(default)) }