use dynamic_config::{dynamic_config, Origin};
use serde::Deserialize;
#[dynamic_config(files = ["dynamic-config/examples/config.json"], key = "server", env = "APP_")]
#[derive(Debug, Deserialize)]
struct ServerConfig {
#[allow(dead_code)]
host: String,
port: u16,
#[serde(default)]
workers: u16,
}
fn show(stage: &str) -> Result<(), dynamic_config::Error> {
let config = ServerConfig::load()?;
let origin = ServerConfig::source_of("port")?.unwrap_or(Origin::Unknown);
println!(
"{stage:<24} port = {:<6} workers = {:<4} ({origin})",
config.port, config.workers
);
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
show("file only")?;
ServerConfig::set_default("port", 1u16)?;
ServerConfig::set_default("workers", 4u16)?;
show("+ defaults")?;
std::env::set_var("APP_SERVER_PORT", "3000");
show("+ environment")?;
ServerConfig::set_flag("port", Some(4000u16))?;
show("+ flag")?;
ServerConfig::set_override("port", 5000u16)?;
show("+ override")?;
ServerConfig::clear_overrides();
ServerConfig::clear_flags();
std::env::remove_var("APP_SERVER_PORT");
show("back to the file")?;
Ok(())
}