use premortem::prelude::*;
use serde::Deserialize;
#[derive(Debug, Deserialize, DeriveValidate)]
struct AppConfig {
#[validate(non_empty, message = "host cannot be empty")]
host: String,
#[validate(range(1..=65535))]
port: u16,
#[serde(default)]
debug: bool,
}
fn main() {
let result = Config::<AppConfig>::builder()
.source(Toml::file("config.toml").optional())
.source(Env::prefix("APP_"))
.build();
match result {
Ok(config) => {
println!("Configuration loaded successfully!");
println!(" Host: {}", config.host);
println!(" Port: {}", config.port);
println!(" Debug: {}", config.debug);
}
Err(errors) => {
eprintln!("Configuration errors ({}):", errors.len());
for error in errors.iter() {
eprintln!(" - {}", error);
}
std::process::exit(1);
}
}
}