1use clap::error::Error;
2use clap::{Arg, ArgAction, ArgMatches, Args, Command, FromArgMatches, Parser};
3
4#[derive(Debug)]
5struct CliArgs {
6 foo: bool,
7 bar: bool,
8 quuz: Option<String>,
9}
10
11impl FromArgMatches for CliArgs {
12 fn from_arg_matches(matches: &ArgMatches) -> Result<Self, Error> {
13 let mut matches = matches.clone();
14 Self::from_arg_matches_mut(&mut matches)
15 }
16 fn from_arg_matches_mut(matches: &mut ArgMatches) -> Result<Self, Error> {
17 Ok(Self {
18 foo: matches.get_flag("foo"),
19 bar: matches.get_flag("bar"),
20 quuz: matches.remove_one::<String>("quuz"),
21 })
22 }
23 fn update_from_arg_matches(&mut self, matches: &ArgMatches) -> Result<(), Error> {
24 let mut matches = matches.clone();
25 self.update_from_arg_matches_mut(&mut matches)
26 }
27 fn update_from_arg_matches_mut(&mut self, matches: &mut ArgMatches) -> Result<(), Error> {
28 self.foo |= matches.get_flag("foo");
29 self.bar |= matches.get_flag("bar");
30 if let Some(quuz) = matches.remove_one::<String>("quuz") {
31 self.quuz = Some(quuz);
32 }
33 Ok(())
34 }
35}
36
37impl Args for CliArgs {
38 fn augment_args(cmd: Command) -> Command {
39 cmd.arg(
40 Arg::new("foo")
41 .short('f')
42 .long("foo")
43 .action(ArgAction::SetTrue),
44 )
45 .arg(
46 Arg::new("bar")
47 .short('b')
48 .long("bar")
49 .action(ArgAction::SetTrue),
50 )
51 .arg(
52 Arg::new("quuz")
53 .short('q')
54 .long("quuz")
55 .action(ArgAction::Set),
56 )
57 }
58 fn augment_args_for_update(cmd: Command) -> Command {
59 cmd.arg(
60 Arg::new("foo")
61 .short('f')
62 .long("foo")
63 .action(ArgAction::SetTrue),
64 )
65 .arg(
66 Arg::new("bar")
67 .short('b')
68 .long("bar")
69 .action(ArgAction::SetTrue),
70 )
71 .arg(
72 Arg::new("quuz")
73 .short('q')
74 .long("quuz")
75 .action(ArgAction::Set),
76 )
77 }
78}
79
80#[derive(Parser, Debug)]
81struct Cli {
82 #[arg(short, long)]
83 top_level: bool,
84 #[command(flatten)]
85 more_args: CliArgs,
86}
87
88fn main() {
89 let args = Cli::parse();
90 println!("{args:#?}");
91}
92