use std::ops::RangeInclusive; use clap::Parser; #[derive(Parser)] #[clap(author, version, about, long_about = None)] struct Cli { /// Network port to use #[clap(value_parser = port_in_range)] port: u16, } fn main() { let cli = Cli::parse(); println!("PORT = {}", cli.port); } const PORT_RANGE: RangeInclusive = 1..=65535; fn port_in_range(s: &str) -> Result { let port: usize = s .parse() .map_err(|_| format!("`{}` isn't a port number", s))?; if PORT_RANGE.contains(&port) { Ok(port as u16) } else { Err(format!( "Port not in range {}-{}", PORT_RANGE.start(), PORT_RANGE.end() )) } }