use dynamic_config::dynamic_config;
use serde::Deserialize;
#[dynamic_config(files = ["dynamic-config/examples/app.json"], key = "server", env = "APP_", watch)]
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
struct ServerConfig {
host: String,
port: u16,
}
#[dynamic_config(
files = ["dynamic-config/examples/app.json", "dynamic-config/examples/app.secrets.json"],
key = "db",
env = "APP_",
watch,
)]
#[derive(Deserialize)]
#[allow(dead_code)]
struct DatabaseConfig {
host: String,
#[config(secret)]
password: String,
}
#[dynamic_config(files = ["dynamic-config/examples/app.json"], key = "features", env = "APP_")]
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
struct FeatureFlags {
metrics: bool,
tracing: bool,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
ServerConfig::init()?;
DatabaseConfig::init()?;
FeatureFlags::init()?;
let _watchers = (ServerConfig::start_watch()?, DatabaseConfig::start_watch()?);
println!("server: {:?}", ServerConfig::current());
println!("database: {:?}", DatabaseConfig::current());
println!("features: {:?}", FeatureFlags::current());
println!("\nEach type sees only its own key:");
println!(
" ServerConfig::is_set(\"password\") = {}",
ServerConfig::is_set("password")?
);
println!(
" DatabaseConfig::is_set(\"password\") = {}",
DatabaseConfig::is_set("password")?
);
Ok(())
}