zero-to-axum/src/conf.rs
2025-07-24 10:43:29 -05:00

52 lines
1.2 KiB
Rust

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,
pub key: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Email {
pub server: String,
pub port: Option<u16>,
pub username: String,
pub password: String,
pub sender: String,
pub cert: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
#[allow(unused)]
pub struct Conf {
pub debug: bool,
pub database: Database,
pub app: App,
pub email: Option<Email>,
}
impl Conf {
pub fn read() -> Result<Self> {
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()?)
}
}