use anyhow::{Context, Result, bail};
fn parse_field(value: &str) -> Result<u16> {
let port: u16 = value.trim().parse()?;
if port == 0 {
bail!("port must not be zero");
}
Ok(port)
}
fn load_config(_path: &str) -> Result<u16> {
let raw_config = "port = notanumber";
let port_str = raw_config
.strip_prefix("port = ")
.context("missing 'port' field")?;
parse_field(port_str).context("invalid value for field \"port\"")
}
fn start_server() -> Result<()> {
let path = "server.toml";
let port =
load_config(path).with_context(|| format!("failed to load config from \"{path}\""))?;
println!("listening on port {port}");
Ok(())
}
fn main() {
if let Err(e) = start_server().context("failed to start server") {
println!("One-line: {e:#}");
println!("\nFull chain:\n{e:?}");
}
}