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}