use config::{Config, Environment, File}; use serde::Deserialize; #[derive(Debug, Deserialize, Clone)] pub struct Settings { pub server: ServerSettings, pub app: AppSettings, } #[derive(Debug, Deserialize, Clone)] pub struct AppSettings { pub heartbeat_interval_secs: u64, pub metrics_interval_secs: u64, pub port: u16, } #[derive(Debug, Deserialize, Clone)] pub struct ServerSettings { pub url: String, } impl Settings { pub fn new() -> Result { // Load .env file first dotenvy::dotenv().ok(); // Merge settings from multiple sources let builder = config::Config::builder() .add_source(config::File::with_name("Settings").required(false)) // Settings.toml optional .add_source(Environment::default().separator("_")); builder.build()?.try_deserialize() } }