use std::env;
use config::{Config, ConfigError, Environment, File};
use serde::Deserialize;
fn main() {
let settings = Settings::new();
println!("{settings:?}");
}
#[derive(Debug, Deserialize)]
#[allow(unused)]
pub(crate) struct Settings {
debug: bool,
database: Database,
sparkpost: Sparkpost,
twitter: Twitter,
braintree: Braintree,
}
impl Settings {
pub(crate) fn new() -> Result<Self, ConfigError> {
let run_mode = env::var("RUN_MODE").unwrap_or_else(|_| "development".into());
let s = Config::builder()
.add_source(File::with_name("examples/hierarchical-env/config/default"))
.add_source(
File::with_name(&format!("examples/hierarchical-env/config/{run_mode}"))
.required(false),
)
.add_source(File::with_name("examples/hierarchical-env/config/local").required(false))
.add_source(Environment::with_prefix("APP"))
.set_override("database.url", "postgres://")?
.build()?;
println!("debug: {:?}", s.get_bool("debug"));
println!("database: {:?}", s.get::<String>("database.url"));
s.try_deserialize()
}
}
#[derive(Debug, Deserialize)]
#[allow(unused)]
struct Database {
url: String,
}
#[derive(Debug, Deserialize)]
#[allow(unused)]
struct Sparkpost {
key: String,
token: String,
url: String,
version: u8,
}
#[derive(Debug, Deserialize)]
#[allow(unused)]
struct Twitter {
consumer_token: String,
consumer_secret: String,
}
#[derive(Debug, Deserialize)]
#[allow(unused)]
struct Braintree {
merchant_id: String,
public_key: String,
private_key: String,
}