use anyhow::Result; use config::{Config, Environment, File}; use serde::Deserialize; use std::{env, net::SocketAddr}; #[derive(Debug, Deserialize, Clone)] pub struct Database { pub url: String, } #[derive(Debug, Deserialize, Clone)] pub struct App { pub listen: SocketAddr, pub public_url: String, } #[derive(Debug, Deserialize, Clone)] pub struct Email { pub server: String, pub port: Option, pub username: String, pub password: String, pub sender: String, pub cert: Option, } #[derive(Debug, Deserialize, Clone)] #[allow(unused)] pub struct Conf { pub debug: bool, pub database: Database, pub app: App, pub email: Option, } impl Conf { pub fn read() -> Result { let mode = env::var("DEPLOYMENT_ENVIRONMENT").unwrap_or_else(|_| "dev".into()); println!("mode: {mode}"); let s = Config::builder() .add_source(File::with_name("conf/default")) .add_source(File::with_name(&format!("conf/{mode}")).required(false)) .add_source(File::with_name("conf/secrets").required(false)) .add_source(Environment::with_prefix("z2a")) .build()?; Ok(s.try_deserialize()?) } }