use std::time::Duration;
use dynamic_config::dynamic_config;
use serde::Deserialize;
#[dynamic_config]
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
struct ServerConfig {
host: String,
port: u16,
}
#[dynamic_config]
#[derive(Deserialize)]
#[allow(dead_code)]
struct DatabaseConfig {
host: String,
#[config(secret)]
password: String,
}
#[dynamic_config]
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
struct FeatureFlags {
metrics: bool,
tracing: bool,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let server = ServerConfig::builder("server")
.file("dynamic-config/examples/app.json")
.env("APP_");
let database = DatabaseConfig::builder("db")
.file("dynamic-config/examples/app.json")
.file("dynamic-config/examples/app.secrets.json")
.env("APP_");
let features = FeatureFlags::builder("features")
.file("dynamic-config/examples/app.json")
.env("APP_");
server.init()?;
database.init()?;
features.init()?;
let debounce = Duration::from_millis(250);
let _watchers = (server.watch(debounce)?, database.watch(debounce)?);
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(())
}