• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::path::PathBuf;
2 
3 use clap::{arg, command, value_parser, ArgAction, ArgGroup};
4 
main()5 fn main() {
6     // Create application like normal
7     let matches = command!() // requires `cargo` feature
8         // Add the version arguments
9         .arg(arg!(--"set-ver" <VER> "set version manually"))
10         .arg(arg!(--major         "auto inc major").action(ArgAction::SetTrue))
11         .arg(arg!(--minor         "auto inc minor").action(ArgAction::SetTrue))
12         .arg(arg!(--patch         "auto inc patch").action(ArgAction::SetTrue))
13         // Create a group, make it required, and add the above arguments
14         .group(
15             ArgGroup::new("vers")
16                 .required(true)
17                 .args(["set-ver", "major", "minor", "patch"]),
18         )
19         // Arguments can also be added to a group individually, these two arguments
20         // are part of the "input" group which is not required
21         .arg(
22             arg!([INPUT_FILE] "some regular input")
23                 .value_parser(value_parser!(PathBuf))
24                 .group("input"),
25         )
26         .arg(
27             arg!(--"spec-in" <SPEC_IN> "some special input argument")
28                 .value_parser(value_parser!(PathBuf))
29                 .group("input"),
30         )
31         // Now let's assume we have a -c [config] argument which requires one of
32         // (but **not** both) the "input" arguments
33         .arg(
34             arg!(config: -c <CONFIG>)
35                 .value_parser(value_parser!(PathBuf))
36                 .requires("input"),
37         )
38         .get_matches();
39 
40     // Let's assume the old version 1.2.3
41     let mut major = 1;
42     let mut minor = 2;
43     let mut patch = 3;
44 
45     // See if --set-ver was used to set the version manually
46     let version = if let Some(ver) = matches.get_one::<String>("set-ver") {
47         ver.to_owned()
48     } else {
49         // Increment the one requested (in a real program, we'd reset the lower numbers)
50         let (maj, min, pat) = (
51             matches.get_flag("major"),
52             matches.get_flag("minor"),
53             matches.get_flag("patch"),
54         );
55         match (maj, min, pat) {
56             (true, _, _) => major += 1,
57             (_, true, _) => minor += 1,
58             (_, _, true) => patch += 1,
59             _ => unreachable!(),
60         };
61         format!("{}.{}.{}", major, minor, patch)
62     };
63 
64     println!("Version: {}", version);
65 
66     // Check for usage of -c
67     if matches.contains_id("config") {
68         let input = matches
69             .get_one::<PathBuf>("INPUT_FILE")
70             .unwrap_or_else(|| matches.get_one::<PathBuf>("spec-in").unwrap())
71             .display();
72         println!(
73             "Doing work using input {} and config {}",
74             input,
75             matches.get_one::<PathBuf>("config").unwrap().display()
76         );
77     }
78 }
79