use dynamic_config::dynamic_config;
use serde::Deserialize;
#[dynamic_config(files = ["dynamic-config/examples/app.json"], key = "server", env = "APP_")]
#[derive(Debug, Deserialize)]
struct ServerConfig {
host: String,
port: u16,
}
fn describe_binding() -> Result<String, dynamic_config::Error> {
let config = ServerConfig::current();
Ok(format!("{}:{}", config.host, config.port))
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
ServerConfig::init()?;
println!("as deployed: {}", describe_binding()?);
ServerConfig::set_override("port", 1u16)?;
ServerConfig::init()?;
println!("under test: {}", describe_binding()?);
ServerConfig::clear_overrides();
ServerConfig::init()?;
println!("restored: {}", describe_binding()?);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn an_override_decides_what_the_code_under_test_sees() {
ServerConfig::set_override("host", "test-host").unwrap();
ServerConfig::set_override("port", 1234u16).unwrap();
ServerConfig::init().unwrap();
assert_eq!(describe_binding().unwrap(), "test-host:1234");
ServerConfig::clear_overrides();
}
}