hello/
hello.rs

1struct Args {
2    thing: String,
3    number: u32,
4    shout: bool,
5}
6
7fn parse_args() -> Result<Args, lexopt::Error> {
8    use lexopt::prelude::*;
9
10    let mut thing = None;
11    let mut number = 1;
12    let mut shout = false;
13    let mut parser = lexopt::Parser::from_env();
14    while let Some(arg) = parser.next()? {
15        match arg {
16            Short('n') | Long("number") => {
17                number = parser.value()?.parse()?;
18            }
19            Long("shout") => {
20                shout = true;
21            }
22            Value(val) if thing.is_none() => {
23                thing = Some(val.string()?);
24            }
25            Long("help") => {
26                println!("Usage: hello [-n|--number=NUM] [--shout] THING");
27                std::process::exit(0);
28            }
29            _ => return Err(arg.unexpected()),
30        }
31    }
32
33    Ok(Args {
34        thing: thing.ok_or("missing argument THING")?,
35        number,
36        shout,
37    })
38}
39
40fn main() -> Result<(), lexopt::Error> {
41    let args = parse_args()?;
42    let mut message = format!("Hello {}", args.thing);
43    if args.shout {
44        message = message.to_uppercase();
45    }
46    for _ in 0..args.number {
47        println!("{}", message);
48    }
49    Ok(())
50}