1 | use std::path::PathBuf; |
2 | |
3 | use clap::{arg, command, value_parser, ArgAction, Command}; |
4 | |
5 | fn main() { |
6 | let matches = command!() // requires `cargo` feature |
7 | .arg(arg!([name] "Optional name to operate on" )) |
8 | .arg( |
9 | arg!( |
10 | -c --config <FILE> "Sets a custom config file" |
11 | ) |
12 | // We don't have syntax yet for optional options, so manually calling `required` |
13 | .required(false) |
14 | .value_parser(value_parser!(PathBuf)), |
15 | ) |
16 | .arg(arg!( |
17 | -d --debug ... "Turn debugging information on" |
18 | )) |
19 | .subcommand( |
20 | Command::new("test" ) |
21 | .about("does testing things" ) |
22 | .arg(arg!(-l --list "lists test values" ).action(ArgAction::SetTrue)), |
23 | ) |
24 | .get_matches(); |
25 | |
26 | // You can check the value provided by positional arguments, or option arguments |
27 | if let Some(name) = matches.get_one::<String>("name" ) { |
28 | println!("Value for name: {name}" ); |
29 | } |
30 | |
31 | if let Some(config_path) = matches.get_one::<PathBuf>("config" ) { |
32 | println!("Value for config: {}" , config_path.display()); |
33 | } |
34 | |
35 | // You can see how many times a particular flag or argument occurred |
36 | // Note, only flags can have multiple occurrences |
37 | match matches |
38 | .get_one::<u8>("debug" ) |
39 | .expect("Count's are defaulted" ) |
40 | { |
41 | 0 => println!("Debug mode is off" ), |
42 | 1 => println!("Debug mode is kind of on" ), |
43 | 2 => println!("Debug mode is on" ), |
44 | _ => println!("Don't be crazy" ), |
45 | } |
46 | |
47 | // You can check for the existence of subcommands, and if found use their |
48 | // matches just as you would the top level cmd |
49 | if let Some(matches) = matches.subcommand_matches("test" ) { |
50 | // "$ myapp test" was run |
51 | if matches.get_flag("list" ) { |
52 | // "$ myapp test -l" was run |
53 | println!("Printing testing lists..." ); |
54 | } else { |
55 | println!("Not printing testing lists..." ); |
56 | } |
57 | } |
58 | |
59 | // Continued program logic goes here... |
60 | } |
61 | |