use anyhow::Result;
use thiserror::Error;
#[derive(Debug, Error)]
enum ConfigError {
#[error("failed to read config file")]
Io(#[from] std::io::Error),
#[error("invalid port number: {0}")]
InvalidPort(#[from] std::num::ParseIntError),
#[error("port {0} is out of range (must be 1024..65535)")]
PortOutOfRange(u16),
}
fn parse_port(path: &str) -> std::result::Result<u16, ConfigError> {
let content = std::fs::read_to_string(path)?; let port: u16 = content.trim().parse()?;
if !(1024..=65535).contains(&port) {
return Err(ConfigError::PortOutOfRange(port));
}
Ok(port)
}
fn main() -> Result<()> {
let port = parse_port("config.txt")?;
println!("Server starting on port {port}");
Ok(())
}