52 lines
1.2 KiB
Rust
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()?)
|
|
}
|
|
}
|