Skip to main content

#
interop_flatten_hand_args/
flatten_hand_args.rs

    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}