use std::{collections::HashMap, sync::OnceLock}; pub static GLOBAL_CONFIG: OnceLock = OnceLock::new(); #[derive(Clone, Debug)] pub struct AppConfig { pub env: HashMap, } impl AppConfig { const ENV_FILES: &'static [&'static str] = &[".env", ".env.local"]; pub fn load() -> AppConfig { let mut env = HashMap::new(); for env_file in AppConfig::ENV_FILES { if let Err(e) = dotenvy::from_path(env_file) { tracing::debug!(file = %env_file, error = %e, "dotenv load skipped"); } if let Ok(env_file_content) = std::fs::read_to_string(env_file) { for line in env_file_content.lines() { if let Some((key, value)) = line.split_once('=') { env.insert(key.to_string(), value.to_string()); } } } } env = env.into_iter().chain(std::env::vars()).collect(); let this = AppConfig { env }; if let Some(config) = GLOBAL_CONFIG.get() { config.clone() } else { let _ = GLOBAL_CONFIG.set(this); GLOBAL_CONFIG .get() .expect("global config should be set after load") .clone() } } }