1 use std::ops::RangeInclusive;
2
3 use clap::Parser;
4
5 #[derive(Parser)]
6 #[command(author, version, about, long_about = None)]
7 struct Cli {
8 /// Network port to use
9 #[arg(value_parser = port_in_range)]
10 port: u16,
11 }
12
main()13 fn main() {
14 let cli = Cli::parse();
15
16 println!("PORT = {}", cli.port);
17 }
18
19 const PORT_RANGE: RangeInclusive<usize> = 1..=65535;
20
port_in_range(s: &str) -> Result<u16, String>21 fn port_in_range(s: &str) -> Result<u16, String> {
22 let port: usize = s
23 .parse()
24 .map_err(|_| format!("`{}` isn't a port number", s))?;
25 if PORT_RANGE.contains(&port) {
26 Ok(port as u16)
27 } else {
28 Err(format!(
29 "port not in range {}-{}",
30 PORT_RANGE.start(),
31 PORT_RANGE.end()
32 ))
33 }
34 }
35