119625d8cSopenharmony_ci// Std
219625d8cSopenharmony_ci#[cfg(feature = "env")]
319625d8cSopenharmony_ciuse std::env;
419625d8cSopenharmony_ci#[cfg(feature = "env")]
519625d8cSopenharmony_ciuse std::ffi::OsString;
619625d8cSopenharmony_ciuse std::{
719625d8cSopenharmony_ci    cmp::{Ord, Ordering},
819625d8cSopenharmony_ci    fmt::{self, Display, Formatter},
919625d8cSopenharmony_ci    str,
1019625d8cSopenharmony_ci};
1119625d8cSopenharmony_ci
1219625d8cSopenharmony_ci// Internal
1319625d8cSopenharmony_ciuse super::{ArgFlags, ArgSettings};
1419625d8cSopenharmony_ciuse crate::builder::ArgPredicate;
1519625d8cSopenharmony_ciuse crate::builder::IntoResettable;
1619625d8cSopenharmony_ciuse crate::builder::OsStr;
1719625d8cSopenharmony_ciuse crate::builder::PossibleValue;
1819625d8cSopenharmony_ciuse crate::builder::Str;
1919625d8cSopenharmony_ciuse crate::builder::StyledStr;
2019625d8cSopenharmony_ciuse crate::builder::ValueRange;
2119625d8cSopenharmony_ciuse crate::ArgAction;
2219625d8cSopenharmony_ciuse crate::Id;
2319625d8cSopenharmony_ciuse crate::ValueHint;
2419625d8cSopenharmony_ciuse crate::INTERNAL_ERROR_MSG;
2519625d8cSopenharmony_ci
2619625d8cSopenharmony_ci/// The abstract representation of a command line argument. Used to set all the options and
2719625d8cSopenharmony_ci/// relationships that define a valid argument for the program.
2819625d8cSopenharmony_ci///
2919625d8cSopenharmony_ci/// There are two methods for constructing [`Arg`]s, using the builder pattern and setting options
3019625d8cSopenharmony_ci/// manually, or using a usage string which is far less verbose but has fewer options. You can also
3119625d8cSopenharmony_ci/// use a combination of the two methods to achieve the best of both worlds.
3219625d8cSopenharmony_ci///
3319625d8cSopenharmony_ci/// - [Basic API][crate::Arg#basic-api]
3419625d8cSopenharmony_ci/// - [Value Handling][crate::Arg#value-handling]
3519625d8cSopenharmony_ci/// - [Help][crate::Arg#help-1]
3619625d8cSopenharmony_ci/// - [Advanced Argument Relations][crate::Arg#advanced-argument-relations]
3719625d8cSopenharmony_ci/// - [Reflection][crate::Arg#reflection]
3819625d8cSopenharmony_ci///
3919625d8cSopenharmony_ci/// # Examples
4019625d8cSopenharmony_ci///
4119625d8cSopenharmony_ci/// ```rust
4219625d8cSopenharmony_ci/// # use clap::{Arg, arg, ArgAction};
4319625d8cSopenharmony_ci/// // Using the traditional builder pattern and setting each option manually
4419625d8cSopenharmony_ci/// let cfg = Arg::new("config")
4519625d8cSopenharmony_ci///       .short('c')
4619625d8cSopenharmony_ci///       .long("config")
4719625d8cSopenharmony_ci///       .action(ArgAction::Set)
4819625d8cSopenharmony_ci///       .value_name("FILE")
4919625d8cSopenharmony_ci///       .help("Provides a config file to myprog");
5019625d8cSopenharmony_ci/// // Using a usage string (setting a similar argument to the one above)
5119625d8cSopenharmony_ci/// let input = arg!(-i --input <FILE> "Provides an input file to the program");
5219625d8cSopenharmony_ci/// ```
5319625d8cSopenharmony_ci#[derive(Default, Clone)]
5419625d8cSopenharmony_cipub struct Arg {
5519625d8cSopenharmony_ci    pub(crate) id: Id,
5619625d8cSopenharmony_ci    pub(crate) help: Option<StyledStr>,
5719625d8cSopenharmony_ci    pub(crate) long_help: Option<StyledStr>,
5819625d8cSopenharmony_ci    pub(crate) action: Option<ArgAction>,
5919625d8cSopenharmony_ci    pub(crate) value_parser: Option<super::ValueParser>,
6019625d8cSopenharmony_ci    pub(crate) blacklist: Vec<Id>,
6119625d8cSopenharmony_ci    pub(crate) settings: ArgFlags,
6219625d8cSopenharmony_ci    pub(crate) overrides: Vec<Id>,
6319625d8cSopenharmony_ci    pub(crate) groups: Vec<Id>,
6419625d8cSopenharmony_ci    pub(crate) requires: Vec<(ArgPredicate, Id)>,
6519625d8cSopenharmony_ci    pub(crate) r_ifs: Vec<(Id, OsStr)>,
6619625d8cSopenharmony_ci    pub(crate) r_ifs_all: Vec<(Id, OsStr)>,
6719625d8cSopenharmony_ci    pub(crate) r_unless: Vec<Id>,
6819625d8cSopenharmony_ci    pub(crate) r_unless_all: Vec<Id>,
6919625d8cSopenharmony_ci    pub(crate) short: Option<char>,
7019625d8cSopenharmony_ci    pub(crate) long: Option<Str>,
7119625d8cSopenharmony_ci    pub(crate) aliases: Vec<(Str, bool)>, // (name, visible)
7219625d8cSopenharmony_ci    pub(crate) short_aliases: Vec<(char, bool)>, // (name, visible)
7319625d8cSopenharmony_ci    pub(crate) disp_ord: Option<usize>,
7419625d8cSopenharmony_ci    pub(crate) val_names: Vec<Str>,
7519625d8cSopenharmony_ci    pub(crate) num_vals: Option<ValueRange>,
7619625d8cSopenharmony_ci    pub(crate) val_delim: Option<char>,
7719625d8cSopenharmony_ci    pub(crate) default_vals: Vec<OsStr>,
7819625d8cSopenharmony_ci    pub(crate) default_vals_ifs: Vec<(Id, ArgPredicate, Option<OsStr>)>,
7919625d8cSopenharmony_ci    pub(crate) default_missing_vals: Vec<OsStr>,
8019625d8cSopenharmony_ci    #[cfg(feature = "env")]
8119625d8cSopenharmony_ci    pub(crate) env: Option<(OsStr, Option<OsString>)>,
8219625d8cSopenharmony_ci    pub(crate) terminator: Option<Str>,
8319625d8cSopenharmony_ci    pub(crate) index: Option<usize>,
8419625d8cSopenharmony_ci    pub(crate) help_heading: Option<Option<Str>>,
8519625d8cSopenharmony_ci    pub(crate) value_hint: Option<ValueHint>,
8619625d8cSopenharmony_ci}
8719625d8cSopenharmony_ci
8819625d8cSopenharmony_ci/// # Basic API
8919625d8cSopenharmony_ciimpl Arg {
9019625d8cSopenharmony_ci    /// Create a new [`Arg`] with a unique name.
9119625d8cSopenharmony_ci    ///
9219625d8cSopenharmony_ci    /// The name is used to check whether or not the argument was used at
9319625d8cSopenharmony_ci    /// runtime, get values, set relationships with other args, etc..
9419625d8cSopenharmony_ci    ///
9519625d8cSopenharmony_ci    /// **NOTE:** In the case of arguments that take values (i.e. [`Arg::action(ArgAction::Set)`])
9619625d8cSopenharmony_ci    /// and positional arguments (i.e. those without a preceding `-` or `--`) the name will also
9719625d8cSopenharmony_ci    /// be displayed when the user prints the usage/help information of the program.
9819625d8cSopenharmony_ci    ///
9919625d8cSopenharmony_ci    /// # Examples
10019625d8cSopenharmony_ci    ///
10119625d8cSopenharmony_ci    /// ```rust
10219625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
10319625d8cSopenharmony_ci    /// Arg::new("config")
10419625d8cSopenharmony_ci    /// # ;
10519625d8cSopenharmony_ci    /// ```
10619625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
10719625d8cSopenharmony_ci    pub fn new(id: impl Into<Id>) -> Self {
10819625d8cSopenharmony_ci        Arg::default().id(id)
10919625d8cSopenharmony_ci    }
11019625d8cSopenharmony_ci
11119625d8cSopenharmony_ci    /// Set the identifier used for referencing this argument in the clap API.
11219625d8cSopenharmony_ci    ///
11319625d8cSopenharmony_ci    /// See [`Arg::new`] for more details.
11419625d8cSopenharmony_ci    #[must_use]
11519625d8cSopenharmony_ci    pub fn id(mut self, id: impl Into<Id>) -> Self {
11619625d8cSopenharmony_ci        self.id = id.into();
11719625d8cSopenharmony_ci        self
11819625d8cSopenharmony_ci    }
11919625d8cSopenharmony_ci
12019625d8cSopenharmony_ci    /// Sets the short version of the argument without the preceding `-`.
12119625d8cSopenharmony_ci    ///
12219625d8cSopenharmony_ci    /// By default `V` and `h` are used by the auto-generated `version` and `help` arguments,
12319625d8cSopenharmony_ci    /// respectively. You will need to disable the auto-generated flags
12419625d8cSopenharmony_ci    /// ([`disable_help_flag`][crate::Command::disable_help_flag],
12519625d8cSopenharmony_ci    /// [`disable_version_flag`][crate::Command::disable_version_flag]) and define your own.
12619625d8cSopenharmony_ci    ///
12719625d8cSopenharmony_ci    /// # Examples
12819625d8cSopenharmony_ci    ///
12919625d8cSopenharmony_ci    /// When calling `short`, use a single valid UTF-8 character which will allow using the
13019625d8cSopenharmony_ci    /// argument via a single hyphen (`-`) such as `-c`:
13119625d8cSopenharmony_ci    ///
13219625d8cSopenharmony_ci    /// ```rust
13319625d8cSopenharmony_ci    /// # use clap::{Command, Arg,  ArgAction};
13419625d8cSopenharmony_ci    /// let m = Command::new("prog")
13519625d8cSopenharmony_ci    ///     .arg(Arg::new("config")
13619625d8cSopenharmony_ci    ///         .short('c')
13719625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
13819625d8cSopenharmony_ci    ///     .get_matches_from(vec![
13919625d8cSopenharmony_ci    ///         "prog", "-c", "file.toml"
14019625d8cSopenharmony_ci    ///     ]);
14119625d8cSopenharmony_ci    ///
14219625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("config").map(String::as_str), Some("file.toml"));
14319625d8cSopenharmony_ci    /// ```
14419625d8cSopenharmony_ci    ///
14519625d8cSopenharmony_ci    /// To use `-h` for your own flag and still have help:
14619625d8cSopenharmony_ci    /// ```rust
14719625d8cSopenharmony_ci    /// # use clap::{Command, Arg,  ArgAction};
14819625d8cSopenharmony_ci    /// let m = Command::new("prog")
14919625d8cSopenharmony_ci    ///     .disable_help_flag(true)
15019625d8cSopenharmony_ci    ///     .arg(Arg::new("host")
15119625d8cSopenharmony_ci    ///         .short('h')
15219625d8cSopenharmony_ci    ///         .long("host"))
15319625d8cSopenharmony_ci    ///     .arg(Arg::new("help")
15419625d8cSopenharmony_ci    ///         .long("help")
15519625d8cSopenharmony_ci    ///         .global(true)
15619625d8cSopenharmony_ci    ///         .action(ArgAction::Help))
15719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
15819625d8cSopenharmony_ci    ///         "prog", "-h", "wikipedia.org"
15919625d8cSopenharmony_ci    ///     ]);
16019625d8cSopenharmony_ci    ///
16119625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("host").map(String::as_str), Some("wikipedia.org"));
16219625d8cSopenharmony_ci    /// ```
16319625d8cSopenharmony_ci    #[inline]
16419625d8cSopenharmony_ci    #[must_use]
16519625d8cSopenharmony_ci    pub fn short(mut self, s: impl IntoResettable<char>) -> Self {
16619625d8cSopenharmony_ci        if let Some(s) = s.into_resettable().into_option() {
16719625d8cSopenharmony_ci            debug_assert!(s != '-', "short option name cannot be `-`");
16819625d8cSopenharmony_ci            self.short = Some(s);
16919625d8cSopenharmony_ci        } else {
17019625d8cSopenharmony_ci            self.short = None;
17119625d8cSopenharmony_ci        }
17219625d8cSopenharmony_ci        self
17319625d8cSopenharmony_ci    }
17419625d8cSopenharmony_ci
17519625d8cSopenharmony_ci    /// Sets the long version of the argument without the preceding `--`.
17619625d8cSopenharmony_ci    ///
17719625d8cSopenharmony_ci    /// By default `version` and `help` are used by the auto-generated `version` and `help`
17819625d8cSopenharmony_ci    /// arguments, respectively. You may use the word `version` or `help` for the long form of your
17919625d8cSopenharmony_ci    /// own arguments, in which case `clap` simply will not assign those to the auto-generated
18019625d8cSopenharmony_ci    /// `version` or `help` arguments.
18119625d8cSopenharmony_ci    ///
18219625d8cSopenharmony_ci    /// **NOTE:** Any leading `-` characters will be stripped
18319625d8cSopenharmony_ci    ///
18419625d8cSopenharmony_ci    /// # Examples
18519625d8cSopenharmony_ci    ///
18619625d8cSopenharmony_ci    /// To set `long` use a word containing valid UTF-8. If you supply a double leading
18719625d8cSopenharmony_ci    /// `--` such as `--config` they will be stripped. Hyphens in the middle of the word, however,
18819625d8cSopenharmony_ci    /// will *not* be stripped (i.e. `config-file` is allowed).
18919625d8cSopenharmony_ci    ///
19019625d8cSopenharmony_ci    /// Setting `long` allows using the argument via a double hyphen (`--`) such as `--config`
19119625d8cSopenharmony_ci    ///
19219625d8cSopenharmony_ci    /// ```rust
19319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
19419625d8cSopenharmony_ci    /// let m = Command::new("prog")
19519625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
19619625d8cSopenharmony_ci    ///         .long("config")
19719625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
19819625d8cSopenharmony_ci    ///     .get_matches_from(vec![
19919625d8cSopenharmony_ci    ///         "prog", "--config", "file.toml"
20019625d8cSopenharmony_ci    ///     ]);
20119625d8cSopenharmony_ci    ///
20219625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("cfg").map(String::as_str), Some("file.toml"));
20319625d8cSopenharmony_ci    /// ```
20419625d8cSopenharmony_ci    #[inline]
20519625d8cSopenharmony_ci    #[must_use]
20619625d8cSopenharmony_ci    pub fn long(mut self, l: impl IntoResettable<Str>) -> Self {
20719625d8cSopenharmony_ci        self.long = l.into_resettable().into_option();
20819625d8cSopenharmony_ci        self
20919625d8cSopenharmony_ci    }
21019625d8cSopenharmony_ci
21119625d8cSopenharmony_ci    /// Add an alias, which functions as a hidden long flag.
21219625d8cSopenharmony_ci    ///
21319625d8cSopenharmony_ci    /// This is more efficient, and easier than creating multiple hidden arguments as one only
21419625d8cSopenharmony_ci    /// needs to check for the existence of this command, and not all variants.
21519625d8cSopenharmony_ci    ///
21619625d8cSopenharmony_ci    /// # Examples
21719625d8cSopenharmony_ci    ///
21819625d8cSopenharmony_ci    /// ```rust
21919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
22019625d8cSopenharmony_ci    /// let m = Command::new("prog")
22119625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
22219625d8cSopenharmony_ci    ///             .long("test")
22319625d8cSopenharmony_ci    ///             .alias("alias")
22419625d8cSopenharmony_ci    ///             .action(ArgAction::Set))
22519625d8cSopenharmony_ci    ///        .get_matches_from(vec![
22619625d8cSopenharmony_ci    ///             "prog", "--alias", "cool"
22719625d8cSopenharmony_ci    ///         ]);
22819625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("test").unwrap(), "cool");
22919625d8cSopenharmony_ci    /// ```
23019625d8cSopenharmony_ci    #[must_use]
23119625d8cSopenharmony_ci    pub fn alias(mut self, name: impl IntoResettable<Str>) -> Self {
23219625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
23319625d8cSopenharmony_ci            self.aliases.push((name, false));
23419625d8cSopenharmony_ci        } else {
23519625d8cSopenharmony_ci            self.aliases.clear();
23619625d8cSopenharmony_ci        }
23719625d8cSopenharmony_ci        self
23819625d8cSopenharmony_ci    }
23919625d8cSopenharmony_ci
24019625d8cSopenharmony_ci    /// Add an alias, which functions as a hidden short flag.
24119625d8cSopenharmony_ci    ///
24219625d8cSopenharmony_ci    /// This is more efficient, and easier than creating multiple hidden arguments as one only
24319625d8cSopenharmony_ci    /// needs to check for the existence of this command, and not all variants.
24419625d8cSopenharmony_ci    ///
24519625d8cSopenharmony_ci    /// # Examples
24619625d8cSopenharmony_ci    ///
24719625d8cSopenharmony_ci    /// ```rust
24819625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
24919625d8cSopenharmony_ci    /// let m = Command::new("prog")
25019625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
25119625d8cSopenharmony_ci    ///             .short('t')
25219625d8cSopenharmony_ci    ///             .short_alias('e')
25319625d8cSopenharmony_ci    ///             .action(ArgAction::Set))
25419625d8cSopenharmony_ci    ///        .get_matches_from(vec![
25519625d8cSopenharmony_ci    ///             "prog", "-e", "cool"
25619625d8cSopenharmony_ci    ///         ]);
25719625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("test").unwrap(), "cool");
25819625d8cSopenharmony_ci    /// ```
25919625d8cSopenharmony_ci    #[must_use]
26019625d8cSopenharmony_ci    pub fn short_alias(mut self, name: impl IntoResettable<char>) -> Self {
26119625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
26219625d8cSopenharmony_ci            debug_assert!(name != '-', "short alias name cannot be `-`");
26319625d8cSopenharmony_ci            self.short_aliases.push((name, false));
26419625d8cSopenharmony_ci        } else {
26519625d8cSopenharmony_ci            self.short_aliases.clear();
26619625d8cSopenharmony_ci        }
26719625d8cSopenharmony_ci        self
26819625d8cSopenharmony_ci    }
26919625d8cSopenharmony_ci
27019625d8cSopenharmony_ci    /// Add aliases, which function as hidden long flags.
27119625d8cSopenharmony_ci    ///
27219625d8cSopenharmony_ci    /// This is more efficient, and easier than creating multiple hidden subcommands as one only
27319625d8cSopenharmony_ci    /// needs to check for the existence of this command, and not all variants.
27419625d8cSopenharmony_ci    ///
27519625d8cSopenharmony_ci    /// # Examples
27619625d8cSopenharmony_ci    ///
27719625d8cSopenharmony_ci    /// ```rust
27819625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
27919625d8cSopenharmony_ci    /// let m = Command::new("prog")
28019625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
28119625d8cSopenharmony_ci    ///                     .long("test")
28219625d8cSopenharmony_ci    ///                     .aliases(["do-stuff", "do-tests", "tests"])
28319625d8cSopenharmony_ci    ///                     .action(ArgAction::SetTrue)
28419625d8cSopenharmony_ci    ///                     .help("the file to add")
28519625d8cSopenharmony_ci    ///                     .required(false))
28619625d8cSopenharmony_ci    ///             .get_matches_from(vec![
28719625d8cSopenharmony_ci    ///                 "prog", "--do-tests"
28819625d8cSopenharmony_ci    ///             ]);
28919625d8cSopenharmony_ci    /// assert_eq!(m.get_flag("test"), true);
29019625d8cSopenharmony_ci    /// ```
29119625d8cSopenharmony_ci    #[must_use]
29219625d8cSopenharmony_ci    pub fn aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {
29319625d8cSopenharmony_ci        self.aliases
29419625d8cSopenharmony_ci            .extend(names.into_iter().map(|x| (x.into(), false)));
29519625d8cSopenharmony_ci        self
29619625d8cSopenharmony_ci    }
29719625d8cSopenharmony_ci
29819625d8cSopenharmony_ci    /// Add aliases, which functions as a hidden short flag.
29919625d8cSopenharmony_ci    ///
30019625d8cSopenharmony_ci    /// This is more efficient, and easier than creating multiple hidden subcommands as one only
30119625d8cSopenharmony_ci    /// needs to check for the existence of this command, and not all variants.
30219625d8cSopenharmony_ci    ///
30319625d8cSopenharmony_ci    /// # Examples
30419625d8cSopenharmony_ci    ///
30519625d8cSopenharmony_ci    /// ```rust
30619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
30719625d8cSopenharmony_ci    /// let m = Command::new("prog")
30819625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
30919625d8cSopenharmony_ci    ///                     .short('t')
31019625d8cSopenharmony_ci    ///                     .short_aliases(['e', 's'])
31119625d8cSopenharmony_ci    ///                     .action(ArgAction::SetTrue)
31219625d8cSopenharmony_ci    ///                     .help("the file to add")
31319625d8cSopenharmony_ci    ///                     .required(false))
31419625d8cSopenharmony_ci    ///             .get_matches_from(vec![
31519625d8cSopenharmony_ci    ///                 "prog", "-s"
31619625d8cSopenharmony_ci    ///             ]);
31719625d8cSopenharmony_ci    /// assert_eq!(m.get_flag("test"), true);
31819625d8cSopenharmony_ci    /// ```
31919625d8cSopenharmony_ci    #[must_use]
32019625d8cSopenharmony_ci    pub fn short_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {
32119625d8cSopenharmony_ci        for s in names {
32219625d8cSopenharmony_ci            debug_assert!(s != '-', "short alias name cannot be `-`");
32319625d8cSopenharmony_ci            self.short_aliases.push((s, false));
32419625d8cSopenharmony_ci        }
32519625d8cSopenharmony_ci        self
32619625d8cSopenharmony_ci    }
32719625d8cSopenharmony_ci
32819625d8cSopenharmony_ci    /// Add an alias, which functions as a visible long flag.
32919625d8cSopenharmony_ci    ///
33019625d8cSopenharmony_ci    /// Like [`Arg::alias`], except that they are visible inside the help message.
33119625d8cSopenharmony_ci    ///
33219625d8cSopenharmony_ci    /// # Examples
33319625d8cSopenharmony_ci    ///
33419625d8cSopenharmony_ci    /// ```rust
33519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
33619625d8cSopenharmony_ci    /// let m = Command::new("prog")
33719625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
33819625d8cSopenharmony_ci    ///                 .visible_alias("something-awesome")
33919625d8cSopenharmony_ci    ///                 .long("test")
34019625d8cSopenharmony_ci    ///                 .action(ArgAction::Set))
34119625d8cSopenharmony_ci    ///        .get_matches_from(vec![
34219625d8cSopenharmony_ci    ///             "prog", "--something-awesome", "coffee"
34319625d8cSopenharmony_ci    ///         ]);
34419625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("test").unwrap(), "coffee");
34519625d8cSopenharmony_ci    /// ```
34619625d8cSopenharmony_ci    /// [`Command::alias`]: Arg::alias()
34719625d8cSopenharmony_ci    #[must_use]
34819625d8cSopenharmony_ci    pub fn visible_alias(mut self, name: impl IntoResettable<Str>) -> Self {
34919625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
35019625d8cSopenharmony_ci            self.aliases.push((name, true));
35119625d8cSopenharmony_ci        } else {
35219625d8cSopenharmony_ci            self.aliases.clear();
35319625d8cSopenharmony_ci        }
35419625d8cSopenharmony_ci        self
35519625d8cSopenharmony_ci    }
35619625d8cSopenharmony_ci
35719625d8cSopenharmony_ci    /// Add an alias, which functions as a visible short flag.
35819625d8cSopenharmony_ci    ///
35919625d8cSopenharmony_ci    /// Like [`Arg::short_alias`], except that they are visible inside the help message.
36019625d8cSopenharmony_ci    ///
36119625d8cSopenharmony_ci    /// # Examples
36219625d8cSopenharmony_ci    ///
36319625d8cSopenharmony_ci    /// ```rust
36419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
36519625d8cSopenharmony_ci    /// let m = Command::new("prog")
36619625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
36719625d8cSopenharmony_ci    ///                 .long("test")
36819625d8cSopenharmony_ci    ///                 .visible_short_alias('t')
36919625d8cSopenharmony_ci    ///                 .action(ArgAction::Set))
37019625d8cSopenharmony_ci    ///        .get_matches_from(vec![
37119625d8cSopenharmony_ci    ///             "prog", "-t", "coffee"
37219625d8cSopenharmony_ci    ///         ]);
37319625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("test").unwrap(), "coffee");
37419625d8cSopenharmony_ci    /// ```
37519625d8cSopenharmony_ci    #[must_use]
37619625d8cSopenharmony_ci    pub fn visible_short_alias(mut self, name: impl IntoResettable<char>) -> Self {
37719625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
37819625d8cSopenharmony_ci            debug_assert!(name != '-', "short alias name cannot be `-`");
37919625d8cSopenharmony_ci            self.short_aliases.push((name, true));
38019625d8cSopenharmony_ci        } else {
38119625d8cSopenharmony_ci            self.short_aliases.clear();
38219625d8cSopenharmony_ci        }
38319625d8cSopenharmony_ci        self
38419625d8cSopenharmony_ci    }
38519625d8cSopenharmony_ci
38619625d8cSopenharmony_ci    /// Add aliases, which function as visible long flags.
38719625d8cSopenharmony_ci    ///
38819625d8cSopenharmony_ci    /// Like [`Arg::aliases`], except that they are visible inside the help message.
38919625d8cSopenharmony_ci    ///
39019625d8cSopenharmony_ci    /// # Examples
39119625d8cSopenharmony_ci    ///
39219625d8cSopenharmony_ci    /// ```rust
39319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
39419625d8cSopenharmony_ci    /// let m = Command::new("prog")
39519625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
39619625d8cSopenharmony_ci    ///                 .long("test")
39719625d8cSopenharmony_ci    ///                 .action(ArgAction::SetTrue)
39819625d8cSopenharmony_ci    ///                 .visible_aliases(["something", "awesome", "cool"]))
39919625d8cSopenharmony_ci    ///        .get_matches_from(vec![
40019625d8cSopenharmony_ci    ///             "prog", "--awesome"
40119625d8cSopenharmony_ci    ///         ]);
40219625d8cSopenharmony_ci    /// assert_eq!(m.get_flag("test"), true);
40319625d8cSopenharmony_ci    /// ```
40419625d8cSopenharmony_ci    /// [`Command::aliases`]: Arg::aliases()
40519625d8cSopenharmony_ci    #[must_use]
40619625d8cSopenharmony_ci    pub fn visible_aliases(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {
40719625d8cSopenharmony_ci        self.aliases
40819625d8cSopenharmony_ci            .extend(names.into_iter().map(|n| (n.into(), true)));
40919625d8cSopenharmony_ci        self
41019625d8cSopenharmony_ci    }
41119625d8cSopenharmony_ci
41219625d8cSopenharmony_ci    /// Add aliases, which function as visible short flags.
41319625d8cSopenharmony_ci    ///
41419625d8cSopenharmony_ci    /// Like [`Arg::short_aliases`], except that they are visible inside the help message.
41519625d8cSopenharmony_ci    ///
41619625d8cSopenharmony_ci    /// # Examples
41719625d8cSopenharmony_ci    ///
41819625d8cSopenharmony_ci    /// ```rust
41919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
42019625d8cSopenharmony_ci    /// let m = Command::new("prog")
42119625d8cSopenharmony_ci    ///             .arg(Arg::new("test")
42219625d8cSopenharmony_ci    ///                 .long("test")
42319625d8cSopenharmony_ci    ///                 .action(ArgAction::SetTrue)
42419625d8cSopenharmony_ci    ///                 .visible_short_aliases(['t', 'e']))
42519625d8cSopenharmony_ci    ///        .get_matches_from(vec![
42619625d8cSopenharmony_ci    ///             "prog", "-t"
42719625d8cSopenharmony_ci    ///         ]);
42819625d8cSopenharmony_ci    /// assert_eq!(m.get_flag("test"), true);
42919625d8cSopenharmony_ci    /// ```
43019625d8cSopenharmony_ci    #[must_use]
43119625d8cSopenharmony_ci    pub fn visible_short_aliases(mut self, names: impl IntoIterator<Item = char>) -> Self {
43219625d8cSopenharmony_ci        for n in names {
43319625d8cSopenharmony_ci            debug_assert!(n != '-', "short alias name cannot be `-`");
43419625d8cSopenharmony_ci            self.short_aliases.push((n, true));
43519625d8cSopenharmony_ci        }
43619625d8cSopenharmony_ci        self
43719625d8cSopenharmony_ci    }
43819625d8cSopenharmony_ci
43919625d8cSopenharmony_ci    /// Specifies the index of a positional argument **starting at** 1.
44019625d8cSopenharmony_ci    ///
44119625d8cSopenharmony_ci    /// **NOTE:** The index refers to position according to **other positional argument**. It does
44219625d8cSopenharmony_ci    /// not define position in the argument list as a whole.
44319625d8cSopenharmony_ci    ///
44419625d8cSopenharmony_ci    /// **NOTE:** You can optionally leave off the `index` method, and the index will be
44519625d8cSopenharmony_ci    /// assigned in order of evaluation. Utilizing the `index` method allows for setting
44619625d8cSopenharmony_ci    /// indexes out of order
44719625d8cSopenharmony_ci    ///
44819625d8cSopenharmony_ci    /// **NOTE:** This is only meant to be used for positional arguments and shouldn't to be used
44919625d8cSopenharmony_ci    /// with [`Arg::short`] or [`Arg::long`].
45019625d8cSopenharmony_ci    ///
45119625d8cSopenharmony_ci    /// **NOTE:** When utilized with [`Arg::num_args(1..)`], only the **last** positional argument
45219625d8cSopenharmony_ci    /// may be defined as having a variable number of arguments (i.e. with the highest index)
45319625d8cSopenharmony_ci    ///
45419625d8cSopenharmony_ci    /// # Panics
45519625d8cSopenharmony_ci    ///
45619625d8cSopenharmony_ci    /// [`Command`] will [`panic!`] if indexes are skipped (such as defining `index(1)` and `index(3)`
45719625d8cSopenharmony_ci    /// but not `index(2)`, or a positional argument is defined as multiple and is not the highest
45819625d8cSopenharmony_ci    /// index
45919625d8cSopenharmony_ci    ///
46019625d8cSopenharmony_ci    /// # Examples
46119625d8cSopenharmony_ci    ///
46219625d8cSopenharmony_ci    /// ```rust
46319625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
46419625d8cSopenharmony_ci    /// Arg::new("config")
46519625d8cSopenharmony_ci    ///     .index(1)
46619625d8cSopenharmony_ci    /// # ;
46719625d8cSopenharmony_ci    /// ```
46819625d8cSopenharmony_ci    ///
46919625d8cSopenharmony_ci    /// ```rust
47019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
47119625d8cSopenharmony_ci    /// let m = Command::new("prog")
47219625d8cSopenharmony_ci    ///     .arg(Arg::new("mode")
47319625d8cSopenharmony_ci    ///         .index(1))
47419625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
47519625d8cSopenharmony_ci    ///         .long("debug")
47619625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
47719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
47819625d8cSopenharmony_ci    ///         "prog", "--debug", "fast"
47919625d8cSopenharmony_ci    ///     ]);
48019625d8cSopenharmony_ci    ///
48119625d8cSopenharmony_ci    /// assert!(m.contains_id("mode"));
48219625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("mode").unwrap(), "fast"); // notice index(1) means "first positional"
48319625d8cSopenharmony_ci    ///                                                           // *not* first argument
48419625d8cSopenharmony_ci    /// ```
48519625d8cSopenharmony_ci    /// [`Arg::short`]: Arg::short()
48619625d8cSopenharmony_ci    /// [`Arg::long`]: Arg::long()
48719625d8cSopenharmony_ci    /// [`Arg::num_args(true)`]: Arg::num_args()
48819625d8cSopenharmony_ci    /// [`Command`]: crate::Command
48919625d8cSopenharmony_ci    #[inline]
49019625d8cSopenharmony_ci    #[must_use]
49119625d8cSopenharmony_ci    pub fn index(mut self, idx: impl IntoResettable<usize>) -> Self {
49219625d8cSopenharmony_ci        self.index = idx.into_resettable().into_option();
49319625d8cSopenharmony_ci        self
49419625d8cSopenharmony_ci    }
49519625d8cSopenharmony_ci
49619625d8cSopenharmony_ci    /// This is a "VarArg" and everything that follows should be captured by it, as if the user had
49719625d8cSopenharmony_ci    /// used a `--`.
49819625d8cSopenharmony_ci    ///
49919625d8cSopenharmony_ci    /// **NOTE:** To start the trailing "VarArg" on unknown flags (and not just a positional
50019625d8cSopenharmony_ci    /// value), set [`allow_hyphen_values`][Arg::allow_hyphen_values].  Either way, users still
50119625d8cSopenharmony_ci    /// have the option to explicitly escape ambiguous arguments with `--`.
50219625d8cSopenharmony_ci    ///
50319625d8cSopenharmony_ci    /// **NOTE:** [`Arg::value_delimiter`] still applies if set.
50419625d8cSopenharmony_ci    ///
50519625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [`Arg::num_args(..)`].
50619625d8cSopenharmony_ci    ///
50719625d8cSopenharmony_ci    /// # Examples
50819625d8cSopenharmony_ci    ///
50919625d8cSopenharmony_ci    /// ```rust
51019625d8cSopenharmony_ci    /// # use clap::{Command, arg};
51119625d8cSopenharmony_ci    /// let m = Command::new("myprog")
51219625d8cSopenharmony_ci    ///     .arg(arg!(<cmd> ... "commands to run").trailing_var_arg(true))
51319625d8cSopenharmony_ci    ///     .get_matches_from(vec!["myprog", "arg1", "-r", "val1"]);
51419625d8cSopenharmony_ci    ///
51519625d8cSopenharmony_ci    /// let trail: Vec<_> = m.get_many::<String>("cmd").unwrap().collect();
51619625d8cSopenharmony_ci    /// assert_eq!(trail, ["arg1", "-r", "val1"]);
51719625d8cSopenharmony_ci    /// ```
51819625d8cSopenharmony_ci    /// [`Arg::num_args(..)`]: crate::Arg::num_args()
51919625d8cSopenharmony_ci    pub fn trailing_var_arg(self, yes: bool) -> Self {
52019625d8cSopenharmony_ci        if yes {
52119625d8cSopenharmony_ci            self.setting(ArgSettings::TrailingVarArg)
52219625d8cSopenharmony_ci        } else {
52319625d8cSopenharmony_ci            self.unset_setting(ArgSettings::TrailingVarArg)
52419625d8cSopenharmony_ci        }
52519625d8cSopenharmony_ci    }
52619625d8cSopenharmony_ci
52719625d8cSopenharmony_ci    /// This arg is the last, or final, positional argument (i.e. has the highest
52819625d8cSopenharmony_ci    /// index) and is *only* able to be accessed via the `--` syntax (i.e. `$ prog args --
52919625d8cSopenharmony_ci    /// last_arg`).
53019625d8cSopenharmony_ci    ///
53119625d8cSopenharmony_ci    /// Even, if no other arguments are left to parse, if the user omits the `--` syntax
53219625d8cSopenharmony_ci    /// they will receive an [`UnknownArgument`] error. Setting an argument to `.last(true)` also
53319625d8cSopenharmony_ci    /// allows one to access this arg early using the `--` syntax. Accessing an arg early, even with
53419625d8cSopenharmony_ci    /// the `--` syntax is otherwise not possible.
53519625d8cSopenharmony_ci    ///
53619625d8cSopenharmony_ci    /// **NOTE:** This will change the usage string to look like `$ prog [OPTIONS] [-- <ARG>]` if
53719625d8cSopenharmony_ci    /// `ARG` is marked as `.last(true)`.
53819625d8cSopenharmony_ci    ///
53919625d8cSopenharmony_ci    /// **NOTE:** This setting will imply [`crate::Command::dont_collapse_args_in_usage`] because failing
54019625d8cSopenharmony_ci    /// to set this can make the usage string very confusing.
54119625d8cSopenharmony_ci    ///
54219625d8cSopenharmony_ci    /// **NOTE**: This setting only applies to positional arguments, and has no effect on OPTIONS
54319625d8cSopenharmony_ci    ///
54419625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
54519625d8cSopenharmony_ci    ///
54619625d8cSopenharmony_ci    /// **CAUTION:** Using this setting *and* having child subcommands is not
54719625d8cSopenharmony_ci    /// recommended with the exception of *also* using
54819625d8cSopenharmony_ci    /// [`crate::Command::args_conflicts_with_subcommands`]
54919625d8cSopenharmony_ci    /// (or [`crate::Command::subcommand_negates_reqs`] if the argument marked `Last` is also
55019625d8cSopenharmony_ci    /// marked [`Arg::required`])
55119625d8cSopenharmony_ci    ///
55219625d8cSopenharmony_ci    /// # Examples
55319625d8cSopenharmony_ci    ///
55419625d8cSopenharmony_ci    /// ```rust
55519625d8cSopenharmony_ci    /// # use clap::{Arg, ArgAction};
55619625d8cSopenharmony_ci    /// Arg::new("args")
55719625d8cSopenharmony_ci    ///     .action(ArgAction::Set)
55819625d8cSopenharmony_ci    ///     .last(true)
55919625d8cSopenharmony_ci    /// # ;
56019625d8cSopenharmony_ci    /// ```
56119625d8cSopenharmony_ci    ///
56219625d8cSopenharmony_ci    /// Setting `last` ensures the arg has the highest [index] of all positional args
56319625d8cSopenharmony_ci    /// and requires that the `--` syntax be used to access it early.
56419625d8cSopenharmony_ci    ///
56519625d8cSopenharmony_ci    /// ```rust
56619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
56719625d8cSopenharmony_ci    /// let res = Command::new("prog")
56819625d8cSopenharmony_ci    ///     .arg(Arg::new("first"))
56919625d8cSopenharmony_ci    ///     .arg(Arg::new("second"))
57019625d8cSopenharmony_ci    ///     .arg(Arg::new("third")
57119625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
57219625d8cSopenharmony_ci    ///         .last(true))
57319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
57419625d8cSopenharmony_ci    ///         "prog", "one", "--", "three"
57519625d8cSopenharmony_ci    ///     ]);
57619625d8cSopenharmony_ci    ///
57719625d8cSopenharmony_ci    /// assert!(res.is_ok());
57819625d8cSopenharmony_ci    /// let m = res.unwrap();
57919625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("third").unwrap(), "three");
58019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("second"), None);
58119625d8cSopenharmony_ci    /// ```
58219625d8cSopenharmony_ci    ///
58319625d8cSopenharmony_ci    /// Even if the positional argument marked `Last` is the only argument left to parse,
58419625d8cSopenharmony_ci    /// failing to use the `--` syntax results in an error.
58519625d8cSopenharmony_ci    ///
58619625d8cSopenharmony_ci    /// ```rust
58719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
58819625d8cSopenharmony_ci    /// let res = Command::new("prog")
58919625d8cSopenharmony_ci    ///     .arg(Arg::new("first"))
59019625d8cSopenharmony_ci    ///     .arg(Arg::new("second"))
59119625d8cSopenharmony_ci    ///     .arg(Arg::new("third")
59219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
59319625d8cSopenharmony_ci    ///         .last(true))
59419625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
59519625d8cSopenharmony_ci    ///         "prog", "one", "two", "three"
59619625d8cSopenharmony_ci    ///     ]);
59719625d8cSopenharmony_ci    ///
59819625d8cSopenharmony_ci    /// assert!(res.is_err());
59919625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);
60019625d8cSopenharmony_ci    /// ```
60119625d8cSopenharmony_ci    /// [index]: Arg::index()
60219625d8cSopenharmony_ci    /// [`UnknownArgument`]: crate::error::ErrorKind::UnknownArgument
60319625d8cSopenharmony_ci    #[inline]
60419625d8cSopenharmony_ci    #[must_use]
60519625d8cSopenharmony_ci    pub fn last(self, yes: bool) -> Self {
60619625d8cSopenharmony_ci        if yes {
60719625d8cSopenharmony_ci            self.setting(ArgSettings::Last)
60819625d8cSopenharmony_ci        } else {
60919625d8cSopenharmony_ci            self.unset_setting(ArgSettings::Last)
61019625d8cSopenharmony_ci        }
61119625d8cSopenharmony_ci    }
61219625d8cSopenharmony_ci
61319625d8cSopenharmony_ci    /// Specifies that the argument must be present.
61419625d8cSopenharmony_ci    ///
61519625d8cSopenharmony_ci    /// Required by default means it is required, when no other conflicting rules or overrides have
61619625d8cSopenharmony_ci    /// been evaluated. Conflicting rules take precedence over being required.
61719625d8cSopenharmony_ci    ///
61819625d8cSopenharmony_ci    /// **Pro tip:** Flags (i.e. not positional, or arguments that take values) shouldn't be
61919625d8cSopenharmony_ci    /// required by default. This is because if a flag were to be required, it should simply be
62019625d8cSopenharmony_ci    /// implied. No additional information is required from user. Flags by their very nature are
62119625d8cSopenharmony_ci    /// simply boolean on/off switches. The only time a user *should* be required to use a flag
62219625d8cSopenharmony_ci    /// is if the operation is destructive in nature, and the user is essentially proving to you,
62319625d8cSopenharmony_ci    /// "Yes, I know what I'm doing."
62419625d8cSopenharmony_ci    ///
62519625d8cSopenharmony_ci    /// # Examples
62619625d8cSopenharmony_ci    ///
62719625d8cSopenharmony_ci    /// ```rust
62819625d8cSopenharmony_ci    /// # use clap::Arg;
62919625d8cSopenharmony_ci    /// Arg::new("config")
63019625d8cSopenharmony_ci    ///     .required(true)
63119625d8cSopenharmony_ci    /// # ;
63219625d8cSopenharmony_ci    /// ```
63319625d8cSopenharmony_ci    ///
63419625d8cSopenharmony_ci    /// Setting required requires that the argument be used at runtime.
63519625d8cSopenharmony_ci    ///
63619625d8cSopenharmony_ci    /// ```rust
63719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
63819625d8cSopenharmony_ci    /// let res = Command::new("prog")
63919625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
64019625d8cSopenharmony_ci    ///         .required(true)
64119625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
64219625d8cSopenharmony_ci    ///         .long("config"))
64319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
64419625d8cSopenharmony_ci    ///         "prog", "--config", "file.conf",
64519625d8cSopenharmony_ci    ///     ]);
64619625d8cSopenharmony_ci    ///
64719625d8cSopenharmony_ci    /// assert!(res.is_ok());
64819625d8cSopenharmony_ci    /// ```
64919625d8cSopenharmony_ci    ///
65019625d8cSopenharmony_ci    /// Setting required and then *not* supplying that argument at runtime is an error.
65119625d8cSopenharmony_ci    ///
65219625d8cSopenharmony_ci    /// ```rust
65319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
65419625d8cSopenharmony_ci    /// let res = Command::new("prog")
65519625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
65619625d8cSopenharmony_ci    ///         .required(true)
65719625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
65819625d8cSopenharmony_ci    ///         .long("config"))
65919625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
66019625d8cSopenharmony_ci    ///         "prog"
66119625d8cSopenharmony_ci    ///     ]);
66219625d8cSopenharmony_ci    ///
66319625d8cSopenharmony_ci    /// assert!(res.is_err());
66419625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
66519625d8cSopenharmony_ci    /// ```
66619625d8cSopenharmony_ci    #[inline]
66719625d8cSopenharmony_ci    #[must_use]
66819625d8cSopenharmony_ci    pub fn required(self, yes: bool) -> Self {
66919625d8cSopenharmony_ci        if yes {
67019625d8cSopenharmony_ci            self.setting(ArgSettings::Required)
67119625d8cSopenharmony_ci        } else {
67219625d8cSopenharmony_ci            self.unset_setting(ArgSettings::Required)
67319625d8cSopenharmony_ci        }
67419625d8cSopenharmony_ci    }
67519625d8cSopenharmony_ci
67619625d8cSopenharmony_ci    /// Sets an argument that is required when this one is present
67719625d8cSopenharmony_ci    ///
67819625d8cSopenharmony_ci    /// i.e. when using this argument, the following argument *must* be present.
67919625d8cSopenharmony_ci    ///
68019625d8cSopenharmony_ci    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required
68119625d8cSopenharmony_ci    ///
68219625d8cSopenharmony_ci    /// # Examples
68319625d8cSopenharmony_ci    ///
68419625d8cSopenharmony_ci    /// ```rust
68519625d8cSopenharmony_ci    /// # use clap::Arg;
68619625d8cSopenharmony_ci    /// Arg::new("config")
68719625d8cSopenharmony_ci    ///     .requires("input")
68819625d8cSopenharmony_ci    /// # ;
68919625d8cSopenharmony_ci    /// ```
69019625d8cSopenharmony_ci    ///
69119625d8cSopenharmony_ci    /// Setting [`Arg::requires(name)`] requires that the argument be used at runtime if the
69219625d8cSopenharmony_ci    /// defining argument is used. If the defining argument isn't used, the other argument isn't
69319625d8cSopenharmony_ci    /// required
69419625d8cSopenharmony_ci    ///
69519625d8cSopenharmony_ci    /// ```rust
69619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
69719625d8cSopenharmony_ci    /// let res = Command::new("prog")
69819625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
69919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
70019625d8cSopenharmony_ci    ///         .requires("input")
70119625d8cSopenharmony_ci    ///         .long("config"))
70219625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
70319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
70419625d8cSopenharmony_ci    ///         "prog"
70519625d8cSopenharmony_ci    ///     ]);
70619625d8cSopenharmony_ci    ///
70719625d8cSopenharmony_ci    /// assert!(res.is_ok()); // We didn't use cfg, so input wasn't required
70819625d8cSopenharmony_ci    /// ```
70919625d8cSopenharmony_ci    ///
71019625d8cSopenharmony_ci    /// Setting [`Arg::requires(name)`] and *not* supplying that argument is an error.
71119625d8cSopenharmony_ci    ///
71219625d8cSopenharmony_ci    /// ```rust
71319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
71419625d8cSopenharmony_ci    /// let res = Command::new("prog")
71519625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
71619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
71719625d8cSopenharmony_ci    ///         .requires("input")
71819625d8cSopenharmony_ci    ///         .long("config"))
71919625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
72019625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
72119625d8cSopenharmony_ci    ///         "prog", "--config", "file.conf"
72219625d8cSopenharmony_ci    ///     ]);
72319625d8cSopenharmony_ci    ///
72419625d8cSopenharmony_ci    /// assert!(res.is_err());
72519625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
72619625d8cSopenharmony_ci    /// ```
72719625d8cSopenharmony_ci    /// [`Arg::requires(name)`]: Arg::requires()
72819625d8cSopenharmony_ci    /// [Conflicting]: Arg::conflicts_with()
72919625d8cSopenharmony_ci    /// [override]: Arg::overrides_with()
73019625d8cSopenharmony_ci    #[must_use]
73119625d8cSopenharmony_ci    pub fn requires(mut self, arg_id: impl IntoResettable<Id>) -> Self {
73219625d8cSopenharmony_ci        if let Some(arg_id) = arg_id.into_resettable().into_option() {
73319625d8cSopenharmony_ci            self.requires.push((ArgPredicate::IsPresent, arg_id));
73419625d8cSopenharmony_ci        } else {
73519625d8cSopenharmony_ci            self.requires.clear();
73619625d8cSopenharmony_ci        }
73719625d8cSopenharmony_ci        self
73819625d8cSopenharmony_ci    }
73919625d8cSopenharmony_ci
74019625d8cSopenharmony_ci    /// This argument must be passed alone; it conflicts with all other arguments.
74119625d8cSopenharmony_ci    ///
74219625d8cSopenharmony_ci    /// # Examples
74319625d8cSopenharmony_ci    ///
74419625d8cSopenharmony_ci    /// ```rust
74519625d8cSopenharmony_ci    /// # use clap::Arg;
74619625d8cSopenharmony_ci    /// Arg::new("config")
74719625d8cSopenharmony_ci    ///     .exclusive(true)
74819625d8cSopenharmony_ci    /// # ;
74919625d8cSopenharmony_ci    /// ```
75019625d8cSopenharmony_ci    ///
75119625d8cSopenharmony_ci    /// Setting an exclusive argument and having any other arguments present at runtime
75219625d8cSopenharmony_ci    /// is an error.
75319625d8cSopenharmony_ci    ///
75419625d8cSopenharmony_ci    /// ```rust
75519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
75619625d8cSopenharmony_ci    /// let res = Command::new("prog")
75719625d8cSopenharmony_ci    ///     .arg(Arg::new("exclusive")
75819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
75919625d8cSopenharmony_ci    ///         .exclusive(true)
76019625d8cSopenharmony_ci    ///         .long("exclusive"))
76119625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
76219625d8cSopenharmony_ci    ///         .long("debug"))
76319625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
76419625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
76519625d8cSopenharmony_ci    ///         "prog", "--exclusive", "file.conf", "file.txt"
76619625d8cSopenharmony_ci    ///     ]);
76719625d8cSopenharmony_ci    ///
76819625d8cSopenharmony_ci    /// assert!(res.is_err());
76919625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);
77019625d8cSopenharmony_ci    /// ```
77119625d8cSopenharmony_ci    #[inline]
77219625d8cSopenharmony_ci    #[must_use]
77319625d8cSopenharmony_ci    pub fn exclusive(self, yes: bool) -> Self {
77419625d8cSopenharmony_ci        if yes {
77519625d8cSopenharmony_ci            self.setting(ArgSettings::Exclusive)
77619625d8cSopenharmony_ci        } else {
77719625d8cSopenharmony_ci            self.unset_setting(ArgSettings::Exclusive)
77819625d8cSopenharmony_ci        }
77919625d8cSopenharmony_ci    }
78019625d8cSopenharmony_ci
78119625d8cSopenharmony_ci    /// Specifies that an argument can be matched to all child [`Subcommand`]s.
78219625d8cSopenharmony_ci    ///
78319625d8cSopenharmony_ci    /// **NOTE:** Global arguments *only* propagate down, **not** up (to parent commands), however
78419625d8cSopenharmony_ci    /// their values once a user uses them will be propagated back up to parents. In effect, this
78519625d8cSopenharmony_ci    /// means one should *define* all global arguments at the top level, however it doesn't matter
78619625d8cSopenharmony_ci    /// where the user *uses* the global argument.
78719625d8cSopenharmony_ci    ///
78819625d8cSopenharmony_ci    /// # Examples
78919625d8cSopenharmony_ci    ///
79019625d8cSopenharmony_ci    /// Assume an application with two subcommands, and you'd like to define a
79119625d8cSopenharmony_ci    /// `--verbose` flag that can be called on any of the subcommands and parent, but you don't
79219625d8cSopenharmony_ci    /// want to clutter the source with three duplicate [`Arg`] definitions.
79319625d8cSopenharmony_ci    ///
79419625d8cSopenharmony_ci    /// ```rust
79519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
79619625d8cSopenharmony_ci    /// let m = Command::new("prog")
79719625d8cSopenharmony_ci    ///     .arg(Arg::new("verb")
79819625d8cSopenharmony_ci    ///         .long("verbose")
79919625d8cSopenharmony_ci    ///         .short('v')
80019625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
80119625d8cSopenharmony_ci    ///         .global(true))
80219625d8cSopenharmony_ci    ///     .subcommand(Command::new("test"))
80319625d8cSopenharmony_ci    ///     .subcommand(Command::new("do-stuff"))
80419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
80519625d8cSopenharmony_ci    ///         "prog", "do-stuff", "--verbose"
80619625d8cSopenharmony_ci    ///     ]);
80719625d8cSopenharmony_ci    ///
80819625d8cSopenharmony_ci    /// assert_eq!(m.subcommand_name(), Some("do-stuff"));
80919625d8cSopenharmony_ci    /// let sub_m = m.subcommand_matches("do-stuff").unwrap();
81019625d8cSopenharmony_ci    /// assert_eq!(sub_m.get_flag("verb"), true);
81119625d8cSopenharmony_ci    /// ```
81219625d8cSopenharmony_ci    ///
81319625d8cSopenharmony_ci    /// [`Subcommand`]: crate::Subcommand
81419625d8cSopenharmony_ci    #[inline]
81519625d8cSopenharmony_ci    #[must_use]
81619625d8cSopenharmony_ci    pub fn global(self, yes: bool) -> Self {
81719625d8cSopenharmony_ci        if yes {
81819625d8cSopenharmony_ci            self.setting(ArgSettings::Global)
81919625d8cSopenharmony_ci        } else {
82019625d8cSopenharmony_ci            self.unset_setting(ArgSettings::Global)
82119625d8cSopenharmony_ci        }
82219625d8cSopenharmony_ci    }
82319625d8cSopenharmony_ci
82419625d8cSopenharmony_ci    #[inline]
82519625d8cSopenharmony_ci    pub(crate) fn is_set(&self, s: ArgSettings) -> bool {
82619625d8cSopenharmony_ci        self.settings.is_set(s)
82719625d8cSopenharmony_ci    }
82819625d8cSopenharmony_ci
82919625d8cSopenharmony_ci    #[inline]
83019625d8cSopenharmony_ci    #[must_use]
83119625d8cSopenharmony_ci    pub(crate) fn setting<F>(mut self, setting: F) -> Self
83219625d8cSopenharmony_ci    where
83319625d8cSopenharmony_ci        F: Into<ArgFlags>,
83419625d8cSopenharmony_ci    {
83519625d8cSopenharmony_ci        self.settings.insert(setting.into());
83619625d8cSopenharmony_ci        self
83719625d8cSopenharmony_ci    }
83819625d8cSopenharmony_ci
83919625d8cSopenharmony_ci    #[inline]
84019625d8cSopenharmony_ci    #[must_use]
84119625d8cSopenharmony_ci    pub(crate) fn unset_setting<F>(mut self, setting: F) -> Self
84219625d8cSopenharmony_ci    where
84319625d8cSopenharmony_ci        F: Into<ArgFlags>,
84419625d8cSopenharmony_ci    {
84519625d8cSopenharmony_ci        self.settings.remove(setting.into());
84619625d8cSopenharmony_ci        self
84719625d8cSopenharmony_ci    }
84819625d8cSopenharmony_ci}
84919625d8cSopenharmony_ci
85019625d8cSopenharmony_ci/// # Value Handling
85119625d8cSopenharmony_ciimpl Arg {
85219625d8cSopenharmony_ci    /// Specify how to react to an argument when parsing it.
85319625d8cSopenharmony_ci    ///
85419625d8cSopenharmony_ci    /// [ArgAction][crate::ArgAction] controls things like
85519625d8cSopenharmony_ci    /// - Overwriting previous values with new ones
85619625d8cSopenharmony_ci    /// - Appending new values to all previous ones
85719625d8cSopenharmony_ci    /// - Counting how many times a flag occurs
85819625d8cSopenharmony_ci    ///
85919625d8cSopenharmony_ci    /// The default action is `ArgAction::Set`
86019625d8cSopenharmony_ci    ///
86119625d8cSopenharmony_ci    /// # Examples
86219625d8cSopenharmony_ci    ///
86319625d8cSopenharmony_ci    /// ```rust
86419625d8cSopenharmony_ci    /// # use clap::Command;
86519625d8cSopenharmony_ci    /// # use clap::Arg;
86619625d8cSopenharmony_ci    /// let cmd = Command::new("mycmd")
86719625d8cSopenharmony_ci    ///     .arg(
86819625d8cSopenharmony_ci    ///         Arg::new("flag")
86919625d8cSopenharmony_ci    ///             .long("flag")
87019625d8cSopenharmony_ci    ///             .action(clap::ArgAction::Append)
87119625d8cSopenharmony_ci    ///     );
87219625d8cSopenharmony_ci    ///
87319625d8cSopenharmony_ci    /// let matches = cmd.try_get_matches_from(["mycmd", "--flag", "value"]).unwrap();
87419625d8cSopenharmony_ci    /// assert!(matches.contains_id("flag"));
87519625d8cSopenharmony_ci    /// assert_eq!(
87619625d8cSopenharmony_ci    ///     matches.get_many::<String>("flag").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),
87719625d8cSopenharmony_ci    ///     vec!["value"]
87819625d8cSopenharmony_ci    /// );
87919625d8cSopenharmony_ci    /// ```
88019625d8cSopenharmony_ci    #[inline]
88119625d8cSopenharmony_ci    #[must_use]
88219625d8cSopenharmony_ci    pub fn action(mut self, action: impl IntoResettable<ArgAction>) -> Self {
88319625d8cSopenharmony_ci        self.action = action.into_resettable().into_option();
88419625d8cSopenharmony_ci        self
88519625d8cSopenharmony_ci    }
88619625d8cSopenharmony_ci
88719625d8cSopenharmony_ci    /// Specify the typed behavior of the argument.
88819625d8cSopenharmony_ci    ///
88919625d8cSopenharmony_ci    /// This allows parsing and validating a value before storing it into
89019625d8cSopenharmony_ci    /// [`ArgMatches`][crate::ArgMatches] as the given type.
89119625d8cSopenharmony_ci    ///
89219625d8cSopenharmony_ci    /// Possible value parsers include:
89319625d8cSopenharmony_ci    /// - [`value_parser!(T)`][crate::value_parser!] for auto-selecting a value parser for a given type
89419625d8cSopenharmony_ci    ///   - Or [range expressions like `0..=1`][std::ops::RangeBounds] as a shorthand for [`RangedI64ValueParser`][crate::builder::RangedI64ValueParser]
89519625d8cSopenharmony_ci    /// - `Fn(&str) -> Result<T, E>`
89619625d8cSopenharmony_ci    /// - `[&str]` and [`PossibleValuesParser`][crate::builder::PossibleValuesParser] for static enumerated values
89719625d8cSopenharmony_ci    /// - [`BoolishValueParser`][crate::builder::BoolishValueParser], and [`FalseyValueParser`][crate::builder::FalseyValueParser] for alternative `bool` implementations
89819625d8cSopenharmony_ci    /// - [`NonEmptyStringValueParser`][crate::builder::NonEmptyStringValueParser] for basic validation for strings
89919625d8cSopenharmony_ci    /// - or any other [`TypedValueParser`][crate::builder::TypedValueParser] implementation
90019625d8cSopenharmony_ci    ///
90119625d8cSopenharmony_ci    /// The default value is [`ValueParser::string`][crate::builder::ValueParser::string].
90219625d8cSopenharmony_ci    ///
90319625d8cSopenharmony_ci    /// ```rust
90419625d8cSopenharmony_ci    /// # use clap::ArgAction;
90519625d8cSopenharmony_ci    /// let mut cmd = clap::Command::new("raw")
90619625d8cSopenharmony_ci    ///     .arg(
90719625d8cSopenharmony_ci    ///         clap::Arg::new("color")
90819625d8cSopenharmony_ci    ///             .long("color")
90919625d8cSopenharmony_ci    ///             .value_parser(["always", "auto", "never"])
91019625d8cSopenharmony_ci    ///             .default_value("auto")
91119625d8cSopenharmony_ci    ///     )
91219625d8cSopenharmony_ci    ///     .arg(
91319625d8cSopenharmony_ci    ///         clap::Arg::new("hostname")
91419625d8cSopenharmony_ci    ///             .long("hostname")
91519625d8cSopenharmony_ci    ///             .value_parser(clap::builder::NonEmptyStringValueParser::new())
91619625d8cSopenharmony_ci    ///             .action(ArgAction::Set)
91719625d8cSopenharmony_ci    ///             .required(true)
91819625d8cSopenharmony_ci    ///     )
91919625d8cSopenharmony_ci    ///     .arg(
92019625d8cSopenharmony_ci    ///         clap::Arg::new("port")
92119625d8cSopenharmony_ci    ///             .long("port")
92219625d8cSopenharmony_ci    ///             .value_parser(clap::value_parser!(u16).range(3000..))
92319625d8cSopenharmony_ci    ///             .action(ArgAction::Set)
92419625d8cSopenharmony_ci    ///             .required(true)
92519625d8cSopenharmony_ci    ///     );
92619625d8cSopenharmony_ci    ///
92719625d8cSopenharmony_ci    /// let m = cmd.try_get_matches_from_mut(
92819625d8cSopenharmony_ci    ///     ["cmd", "--hostname", "rust-lang.org", "--port", "3001"]
92919625d8cSopenharmony_ci    /// ).unwrap();
93019625d8cSopenharmony_ci    ///
93119625d8cSopenharmony_ci    /// let color: &String = m.get_one("color")
93219625d8cSopenharmony_ci    ///     .expect("default");
93319625d8cSopenharmony_ci    /// assert_eq!(color, "auto");
93419625d8cSopenharmony_ci    ///
93519625d8cSopenharmony_ci    /// let hostname: &String = m.get_one("hostname")
93619625d8cSopenharmony_ci    ///     .expect("required");
93719625d8cSopenharmony_ci    /// assert_eq!(hostname, "rust-lang.org");
93819625d8cSopenharmony_ci    ///
93919625d8cSopenharmony_ci    /// let port: u16 = *m.get_one("port")
94019625d8cSopenharmony_ci    ///     .expect("required");
94119625d8cSopenharmony_ci    /// assert_eq!(port, 3001);
94219625d8cSopenharmony_ci    /// ```
94319625d8cSopenharmony_ci    pub fn value_parser(mut self, parser: impl IntoResettable<super::ValueParser>) -> Self {
94419625d8cSopenharmony_ci        self.value_parser = parser.into_resettable().into_option();
94519625d8cSopenharmony_ci        self
94619625d8cSopenharmony_ci    }
94719625d8cSopenharmony_ci
94819625d8cSopenharmony_ci    /// Specifies the number of arguments parsed per occurrence
94919625d8cSopenharmony_ci    ///
95019625d8cSopenharmony_ci    /// For example, if you had a `-f <file>` argument where you wanted exactly 3 'files' you would
95119625d8cSopenharmony_ci    /// set `.num_args(3)`, and this argument wouldn't be satisfied unless the user
95219625d8cSopenharmony_ci    /// provided 3 and only 3 values.
95319625d8cSopenharmony_ci    ///
95419625d8cSopenharmony_ci    /// Users may specify values for arguments in any of the following methods
95519625d8cSopenharmony_ci    ///
95619625d8cSopenharmony_ci    /// - Using a space such as `-o value` or `--option value`
95719625d8cSopenharmony_ci    /// - Using an equals and no space such as `-o=value` or `--option=value`
95819625d8cSopenharmony_ci    /// - Use a short and no space such as `-ovalue`
95919625d8cSopenharmony_ci    ///
96019625d8cSopenharmony_ci    /// **WARNING:**
96119625d8cSopenharmony_ci    ///
96219625d8cSopenharmony_ci    /// Setting a variable number of values (e.g. `1..=10`) for an argument without
96319625d8cSopenharmony_ci    /// other details can be dangerous in some circumstances. Because multiple values are
96419625d8cSopenharmony_ci    /// allowed, `--option val1 val2 val3` is perfectly valid. Be careful when designing a CLI
96519625d8cSopenharmony_ci    /// where **positional arguments** or **subcommands** are *also* expected as `clap` will continue
96619625d8cSopenharmony_ci    /// parsing *values* until one of the following happens:
96719625d8cSopenharmony_ci    ///
96819625d8cSopenharmony_ci    /// - It reaches the maximum number of values
96919625d8cSopenharmony_ci    /// - It reaches a specific number of values
97019625d8cSopenharmony_ci    /// - It finds another flag or option (i.e. something that starts with a `-`)
97119625d8cSopenharmony_ci    /// - It reaches the [`Arg::value_terminator`] if set
97219625d8cSopenharmony_ci    ///
97319625d8cSopenharmony_ci    /// Alternatively,
97419625d8cSopenharmony_ci    /// - Use a delimiter between values with [Arg::value_delimiter]
97519625d8cSopenharmony_ci    /// - Require a flag occurrence per value with [`ArgAction::Append`]
97619625d8cSopenharmony_ci    /// - Require positional arguments to appear after `--` with [`Arg::last`]
97719625d8cSopenharmony_ci    ///
97819625d8cSopenharmony_ci    /// # Examples
97919625d8cSopenharmony_ci    ///
98019625d8cSopenharmony_ci    /// Option:
98119625d8cSopenharmony_ci    /// ```rust
98219625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
98319625d8cSopenharmony_ci    /// let m = Command::new("prog")
98419625d8cSopenharmony_ci    ///     .arg(Arg::new("mode")
98519625d8cSopenharmony_ci    ///         .long("mode")
98619625d8cSopenharmony_ci    ///         .num_args(1))
98719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
98819625d8cSopenharmony_ci    ///         "prog", "--mode", "fast"
98919625d8cSopenharmony_ci    ///     ]);
99019625d8cSopenharmony_ci    ///
99119625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("mode").unwrap(), "fast");
99219625d8cSopenharmony_ci    /// ```
99319625d8cSopenharmony_ci    ///
99419625d8cSopenharmony_ci    /// Flag/option hybrid (see also [default_missing_value][Arg::default_missing_value])
99519625d8cSopenharmony_ci    /// ```rust
99619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
99719625d8cSopenharmony_ci    /// let cmd = Command::new("prog")
99819625d8cSopenharmony_ci    ///     .arg(Arg::new("mode")
99919625d8cSopenharmony_ci    ///         .long("mode")
100019625d8cSopenharmony_ci    ///         .default_missing_value("slow")
100119625d8cSopenharmony_ci    ///         .default_value("plaid")
100219625d8cSopenharmony_ci    ///         .num_args(0..=1));
100319625d8cSopenharmony_ci    ///
100419625d8cSopenharmony_ci    /// let m = cmd.clone()
100519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
100619625d8cSopenharmony_ci    ///         "prog", "--mode", "fast"
100719625d8cSopenharmony_ci    ///     ]);
100819625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("mode").unwrap(), "fast");
100919625d8cSopenharmony_ci    ///
101019625d8cSopenharmony_ci    /// let m = cmd.clone()
101119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
101219625d8cSopenharmony_ci    ///         "prog", "--mode",
101319625d8cSopenharmony_ci    ///     ]);
101419625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("mode").unwrap(), "slow");
101519625d8cSopenharmony_ci    ///
101619625d8cSopenharmony_ci    /// let m = cmd.clone()
101719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
101819625d8cSopenharmony_ci    ///         "prog",
101919625d8cSopenharmony_ci    ///     ]);
102019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("mode").unwrap(), "plaid");
102119625d8cSopenharmony_ci    /// ```
102219625d8cSopenharmony_ci    ///
102319625d8cSopenharmony_ci    /// Tuples
102419625d8cSopenharmony_ci    /// ```rust
102519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
102619625d8cSopenharmony_ci    /// let cmd = Command::new("prog")
102719625d8cSopenharmony_ci    ///     .arg(Arg::new("file")
102819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
102919625d8cSopenharmony_ci    ///         .num_args(2)
103019625d8cSopenharmony_ci    ///         .short('F'));
103119625d8cSopenharmony_ci    ///
103219625d8cSopenharmony_ci    /// let m = cmd.clone()
103319625d8cSopenharmony_ci    ///     .get_matches_from(vec![
103419625d8cSopenharmony_ci    ///         "prog", "-F", "in-file", "out-file"
103519625d8cSopenharmony_ci    ///     ]);
103619625d8cSopenharmony_ci    /// assert_eq!(
103719625d8cSopenharmony_ci    ///     m.get_many::<String>("file").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(),
103819625d8cSopenharmony_ci    ///     vec!["in-file", "out-file"]
103919625d8cSopenharmony_ci    /// );
104019625d8cSopenharmony_ci    ///
104119625d8cSopenharmony_ci    /// let res = cmd.clone()
104219625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
104319625d8cSopenharmony_ci    ///         "prog", "-F", "file1"
104419625d8cSopenharmony_ci    ///     ]);
104519625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
104619625d8cSopenharmony_ci    /// ```
104719625d8cSopenharmony_ci    ///
104819625d8cSopenharmony_ci    /// A common mistake is to define an option which allows multiple values and a positional
104919625d8cSopenharmony_ci    /// argument.
105019625d8cSopenharmony_ci    /// ```rust
105119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
105219625d8cSopenharmony_ci    /// let cmd = Command::new("prog")
105319625d8cSopenharmony_ci    ///     .arg(Arg::new("file")
105419625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
105519625d8cSopenharmony_ci    ///         .num_args(0..)
105619625d8cSopenharmony_ci    ///         .short('F'))
105719625d8cSopenharmony_ci    ///     .arg(Arg::new("word"));
105819625d8cSopenharmony_ci    ///
105919625d8cSopenharmony_ci    /// let m = cmd.clone().get_matches_from(vec![
106019625d8cSopenharmony_ci    ///     "prog", "-F", "file1", "file2", "file3", "word"
106119625d8cSopenharmony_ci    /// ]);
106219625d8cSopenharmony_ci    /// let files: Vec<_> = m.get_many::<String>("file").unwrap().collect();
106319625d8cSopenharmony_ci    /// assert_eq!(files, ["file1", "file2", "file3", "word"]); // wait...what?!
106419625d8cSopenharmony_ci    /// assert!(!m.contains_id("word")); // but we clearly used word!
106519625d8cSopenharmony_ci    ///
106619625d8cSopenharmony_ci    /// // but this works
106719625d8cSopenharmony_ci    /// let m = cmd.clone().get_matches_from(vec![
106819625d8cSopenharmony_ci    ///     "prog", "word", "-F", "file1", "file2", "file3",
106919625d8cSopenharmony_ci    /// ]);
107019625d8cSopenharmony_ci    /// let files: Vec<_> = m.get_many::<String>("file").unwrap().collect();
107119625d8cSopenharmony_ci    /// assert_eq!(files, ["file1", "file2", "file3"]);
107219625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("word").unwrap(), "word");
107319625d8cSopenharmony_ci    /// ```
107419625d8cSopenharmony_ci    /// The problem is `clap` doesn't know when to stop parsing values for "file".
107519625d8cSopenharmony_ci    ///
107619625d8cSopenharmony_ci    /// A solution for the example above is to limit how many values with a maximum, or specific
107719625d8cSopenharmony_ci    /// number, or to say [`ArgAction::Append`] is ok, but multiple values are not.
107819625d8cSopenharmony_ci    /// ```rust
107919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
108019625d8cSopenharmony_ci    /// let m = Command::new("prog")
108119625d8cSopenharmony_ci    ///     .arg(Arg::new("file")
108219625d8cSopenharmony_ci    ///         .action(ArgAction::Append)
108319625d8cSopenharmony_ci    ///         .short('F'))
108419625d8cSopenharmony_ci    ///     .arg(Arg::new("word"))
108519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
108619625d8cSopenharmony_ci    ///         "prog", "-F", "file1", "-F", "file2", "-F", "file3", "word"
108719625d8cSopenharmony_ci    ///     ]);
108819625d8cSopenharmony_ci    ///
108919625d8cSopenharmony_ci    /// let files: Vec<_> = m.get_many::<String>("file").unwrap().collect();
109019625d8cSopenharmony_ci    /// assert_eq!(files, ["file1", "file2", "file3"]);
109119625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("word").unwrap(), "word");
109219625d8cSopenharmony_ci    /// ```
109319625d8cSopenharmony_ci    #[inline]
109419625d8cSopenharmony_ci    #[must_use]
109519625d8cSopenharmony_ci    pub fn num_args(mut self, qty: impl IntoResettable<ValueRange>) -> Self {
109619625d8cSopenharmony_ci        self.num_vals = qty.into_resettable().into_option();
109719625d8cSopenharmony_ci        self
109819625d8cSopenharmony_ci    }
109919625d8cSopenharmony_ci
110019625d8cSopenharmony_ci    #[doc(hidden)]
110119625d8cSopenharmony_ci    #[cfg_attr(
110219625d8cSopenharmony_ci        feature = "deprecated",
110319625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::num_args`")
110419625d8cSopenharmony_ci    )]
110519625d8cSopenharmony_ci    pub fn number_of_values(self, qty: usize) -> Self {
110619625d8cSopenharmony_ci        self.num_args(qty)
110719625d8cSopenharmony_ci    }
110819625d8cSopenharmony_ci
110919625d8cSopenharmony_ci    /// Placeholder for the argument's value in the help message / usage.
111019625d8cSopenharmony_ci    ///
111119625d8cSopenharmony_ci    /// This name is cosmetic only; the name is **not** used to access arguments.
111219625d8cSopenharmony_ci    /// This setting can be very helpful when describing the type of input the user should be
111319625d8cSopenharmony_ci    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
111419625d8cSopenharmony_ci    /// use all capital letters for the value name.
111519625d8cSopenharmony_ci    ///
111619625d8cSopenharmony_ci    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`]
111719625d8cSopenharmony_ci    ///
111819625d8cSopenharmony_ci    /// # Examples
111919625d8cSopenharmony_ci    ///
112019625d8cSopenharmony_ci    /// ```rust
112119625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
112219625d8cSopenharmony_ci    /// Arg::new("cfg")
112319625d8cSopenharmony_ci    ///     .long("config")
112419625d8cSopenharmony_ci    ///     .value_name("FILE")
112519625d8cSopenharmony_ci    /// # ;
112619625d8cSopenharmony_ci    /// ```
112719625d8cSopenharmony_ci    ///
112819625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
112919625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
113019625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
113119625d8cSopenharmony_ci    /// let m = Command::new("prog")
113219625d8cSopenharmony_ci    ///     .arg(Arg::new("config")
113319625d8cSopenharmony_ci    ///         .long("config")
113419625d8cSopenharmony_ci    ///         .value_name("FILE")
113519625d8cSopenharmony_ci    ///         .help("Some help text"))
113619625d8cSopenharmony_ci    ///     .get_matches_from(vec![
113719625d8cSopenharmony_ci    ///         "prog", "--help"
113819625d8cSopenharmony_ci    ///     ]);
113919625d8cSopenharmony_ci    /// ```
114019625d8cSopenharmony_ci    /// Running the above program produces the following output
114119625d8cSopenharmony_ci    ///
114219625d8cSopenharmony_ci    /// ```text
114319625d8cSopenharmony_ci    /// valnames
114419625d8cSopenharmony_ci    ///
114519625d8cSopenharmony_ci    /// Usage: valnames [OPTIONS]
114619625d8cSopenharmony_ci    ///
114719625d8cSopenharmony_ci    /// Options:
114819625d8cSopenharmony_ci    ///     --config <FILE>     Some help text
114919625d8cSopenharmony_ci    ///     -h, --help          Print help information
115019625d8cSopenharmony_ci    ///     -V, --version       Print version information
115119625d8cSopenharmony_ci    /// ```
115219625d8cSopenharmony_ci    /// [positional]: Arg::index()
115319625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
115419625d8cSopenharmony_ci    #[inline]
115519625d8cSopenharmony_ci    #[must_use]
115619625d8cSopenharmony_ci    pub fn value_name(mut self, name: impl IntoResettable<Str>) -> Self {
115719625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
115819625d8cSopenharmony_ci            self.value_names([name])
115919625d8cSopenharmony_ci        } else {
116019625d8cSopenharmony_ci            self.val_names.clear();
116119625d8cSopenharmony_ci            self
116219625d8cSopenharmony_ci        }
116319625d8cSopenharmony_ci    }
116419625d8cSopenharmony_ci
116519625d8cSopenharmony_ci    /// Placeholders for the argument's values in the help message / usage.
116619625d8cSopenharmony_ci    ///
116719625d8cSopenharmony_ci    /// These names are cosmetic only, used for help and usage strings only. The names are **not**
116819625d8cSopenharmony_ci    /// used to access arguments. The values of the arguments are accessed in numeric order (i.e.
116919625d8cSopenharmony_ci    /// if you specify two names `one` and `two` `one` will be the first matched value, `two` will
117019625d8cSopenharmony_ci    /// be the second).
117119625d8cSopenharmony_ci    ///
117219625d8cSopenharmony_ci    /// This setting can be very helpful when describing the type of input the user should be
117319625d8cSopenharmony_ci    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
117419625d8cSopenharmony_ci    /// use all capital letters for the value name.
117519625d8cSopenharmony_ci    ///
117619625d8cSopenharmony_ci    /// **Pro Tip:** It may help to use [`Arg::next_line_help(true)`] if there are long, or
117719625d8cSopenharmony_ci    /// multiple value names in order to not throw off the help text alignment of all options.
117819625d8cSopenharmony_ci    ///
117919625d8cSopenharmony_ci    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`] and [`Arg::num_args(1..)`].
118019625d8cSopenharmony_ci    ///
118119625d8cSopenharmony_ci    /// # Examples
118219625d8cSopenharmony_ci    ///
118319625d8cSopenharmony_ci    /// ```rust
118419625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
118519625d8cSopenharmony_ci    /// Arg::new("speed")
118619625d8cSopenharmony_ci    ///     .short('s')
118719625d8cSopenharmony_ci    ///     .value_names(["fast", "slow"]);
118819625d8cSopenharmony_ci    /// ```
118919625d8cSopenharmony_ci    ///
119019625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
119119625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
119219625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
119319625d8cSopenharmony_ci    /// let m = Command::new("prog")
119419625d8cSopenharmony_ci    ///     .arg(Arg::new("io")
119519625d8cSopenharmony_ci    ///         .long("io-files")
119619625d8cSopenharmony_ci    ///         .value_names(["INFILE", "OUTFILE"]))
119719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
119819625d8cSopenharmony_ci    ///         "prog", "--help"
119919625d8cSopenharmony_ci    ///     ]);
120019625d8cSopenharmony_ci    /// ```
120119625d8cSopenharmony_ci    ///
120219625d8cSopenharmony_ci    /// Running the above program produces the following output
120319625d8cSopenharmony_ci    ///
120419625d8cSopenharmony_ci    /// ```text
120519625d8cSopenharmony_ci    /// valnames
120619625d8cSopenharmony_ci    ///
120719625d8cSopenharmony_ci    /// Usage: valnames [OPTIONS]
120819625d8cSopenharmony_ci    ///
120919625d8cSopenharmony_ci    /// Options:
121019625d8cSopenharmony_ci    ///     -h, --help                       Print help information
121119625d8cSopenharmony_ci    ///     --io-files <INFILE> <OUTFILE>    Some help text
121219625d8cSopenharmony_ci    ///     -V, --version                    Print version information
121319625d8cSopenharmony_ci    /// ```
121419625d8cSopenharmony_ci    /// [`Arg::next_line_help(true)`]: Arg::next_line_help()
121519625d8cSopenharmony_ci    /// [`Arg::num_args`]: Arg::num_args()
121619625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
121719625d8cSopenharmony_ci    /// [`Arg::num_args(1..)`]: Arg::num_args()
121819625d8cSopenharmony_ci    #[must_use]
121919625d8cSopenharmony_ci    pub fn value_names(mut self, names: impl IntoIterator<Item = impl Into<Str>>) -> Self {
122019625d8cSopenharmony_ci        self.val_names = names.into_iter().map(|s| s.into()).collect();
122119625d8cSopenharmony_ci        self
122219625d8cSopenharmony_ci    }
122319625d8cSopenharmony_ci
122419625d8cSopenharmony_ci    /// Provide the shell a hint about how to complete this argument.
122519625d8cSopenharmony_ci    ///
122619625d8cSopenharmony_ci    /// See [`ValueHint`][crate::ValueHint] for more information.
122719625d8cSopenharmony_ci    ///
122819625d8cSopenharmony_ci    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`].
122919625d8cSopenharmony_ci    ///
123019625d8cSopenharmony_ci    /// For example, to take a username as argument:
123119625d8cSopenharmony_ci    ///
123219625d8cSopenharmony_ci    /// ```
123319625d8cSopenharmony_ci    /// # use clap::{Arg, ValueHint};
123419625d8cSopenharmony_ci    /// Arg::new("user")
123519625d8cSopenharmony_ci    ///     .short('u')
123619625d8cSopenharmony_ci    ///     .long("user")
123719625d8cSopenharmony_ci    ///     .value_hint(ValueHint::Username);
123819625d8cSopenharmony_ci    /// ```
123919625d8cSopenharmony_ci    ///
124019625d8cSopenharmony_ci    /// To take a full command line and its arguments (for example, when writing a command wrapper):
124119625d8cSopenharmony_ci    ///
124219625d8cSopenharmony_ci    /// ```
124319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ValueHint, ArgAction};
124419625d8cSopenharmony_ci    /// Command::new("prog")
124519625d8cSopenharmony_ci    ///     .trailing_var_arg(true)
124619625d8cSopenharmony_ci    ///     .arg(
124719625d8cSopenharmony_ci    ///         Arg::new("command")
124819625d8cSopenharmony_ci    ///             .action(ArgAction::Set)
124919625d8cSopenharmony_ci    ///             .num_args(1..)
125019625d8cSopenharmony_ci    ///             .value_hint(ValueHint::CommandWithArguments)
125119625d8cSopenharmony_ci    ///     );
125219625d8cSopenharmony_ci    /// ```
125319625d8cSopenharmony_ci    #[must_use]
125419625d8cSopenharmony_ci    pub fn value_hint(mut self, value_hint: impl IntoResettable<ValueHint>) -> Self {
125519625d8cSopenharmony_ci        self.value_hint = value_hint.into_resettable().into_option();
125619625d8cSopenharmony_ci        self
125719625d8cSopenharmony_ci    }
125819625d8cSopenharmony_ci
125919625d8cSopenharmony_ci    /// Match values against [`PossibleValuesParser`][crate::builder::PossibleValuesParser] without matching case.
126019625d8cSopenharmony_ci    ///
126119625d8cSopenharmony_ci    /// When other arguments are conditionally required based on the
126219625d8cSopenharmony_ci    /// value of a case-insensitive argument, the equality check done
126319625d8cSopenharmony_ci    /// by [`Arg::required_if_eq`], [`Arg::required_if_eq_any`], or
126419625d8cSopenharmony_ci    /// [`Arg::required_if_eq_all`] is case-insensitive.
126519625d8cSopenharmony_ci    ///
126619625d8cSopenharmony_ci    ///
126719625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
126819625d8cSopenharmony_ci    ///
126919625d8cSopenharmony_ci    /// **NOTE:** To do unicode case folding, enable the `unicode` feature flag.
127019625d8cSopenharmony_ci    ///
127119625d8cSopenharmony_ci    /// # Examples
127219625d8cSopenharmony_ci    ///
127319625d8cSopenharmony_ci    /// ```rust
127419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
127519625d8cSopenharmony_ci    /// let m = Command::new("pv")
127619625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
127719625d8cSopenharmony_ci    ///         .long("option")
127819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
127919625d8cSopenharmony_ci    ///         .ignore_case(true)
128019625d8cSopenharmony_ci    ///         .value_parser(["test123"]))
128119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
128219625d8cSopenharmony_ci    ///         "pv", "--option", "TeSt123",
128319625d8cSopenharmony_ci    ///     ]);
128419625d8cSopenharmony_ci    ///
128519625d8cSopenharmony_ci    /// assert!(m.get_one::<String>("option").unwrap().eq_ignore_ascii_case("test123"));
128619625d8cSopenharmony_ci    /// ```
128719625d8cSopenharmony_ci    ///
128819625d8cSopenharmony_ci    /// This setting also works when multiple values can be defined:
128919625d8cSopenharmony_ci    ///
129019625d8cSopenharmony_ci    /// ```rust
129119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
129219625d8cSopenharmony_ci    /// let m = Command::new("pv")
129319625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
129419625d8cSopenharmony_ci    ///         .short('o')
129519625d8cSopenharmony_ci    ///         .long("option")
129619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
129719625d8cSopenharmony_ci    ///         .ignore_case(true)
129819625d8cSopenharmony_ci    ///         .num_args(1..)
129919625d8cSopenharmony_ci    ///         .value_parser(["test123", "test321"]))
130019625d8cSopenharmony_ci    ///     .get_matches_from(vec![
130119625d8cSopenharmony_ci    ///         "pv", "--option", "TeSt123", "teST123", "tESt321"
130219625d8cSopenharmony_ci    ///     ]);
130319625d8cSopenharmony_ci    ///
130419625d8cSopenharmony_ci    /// let matched_vals = m.get_many::<String>("option").unwrap().collect::<Vec<_>>();
130519625d8cSopenharmony_ci    /// assert_eq!(&*matched_vals, &["TeSt123", "teST123", "tESt321"]);
130619625d8cSopenharmony_ci    /// ```
130719625d8cSopenharmony_ci    #[inline]
130819625d8cSopenharmony_ci    #[must_use]
130919625d8cSopenharmony_ci    pub fn ignore_case(self, yes: bool) -> Self {
131019625d8cSopenharmony_ci        if yes {
131119625d8cSopenharmony_ci            self.setting(ArgSettings::IgnoreCase)
131219625d8cSopenharmony_ci        } else {
131319625d8cSopenharmony_ci            self.unset_setting(ArgSettings::IgnoreCase)
131419625d8cSopenharmony_ci        }
131519625d8cSopenharmony_ci    }
131619625d8cSopenharmony_ci
131719625d8cSopenharmony_ci    /// Allows values which start with a leading hyphen (`-`)
131819625d8cSopenharmony_ci    ///
131919625d8cSopenharmony_ci    /// To limit values to just numbers, see
132019625d8cSopenharmony_ci    /// [`allow_negative_numbers`][Arg::allow_negative_numbers].
132119625d8cSopenharmony_ci    ///
132219625d8cSopenharmony_ci    /// See also [`trailing_var_arg`][Arg::trailing_var_arg].
132319625d8cSopenharmony_ci    ///
132419625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
132519625d8cSopenharmony_ci    ///
132619625d8cSopenharmony_ci    /// **WARNING:** Prior arguments with `allow_hyphen_values(true)` get precedence over known
132719625d8cSopenharmony_ci    /// flags but known flags get precedence over the next possible positional argument with
132819625d8cSopenharmony_ci    /// `allow_hyphen_values(true)`.  When combined with [`Arg::num_args(..)`],
132919625d8cSopenharmony_ci    /// [`Arg::value_terminator`] is one way to ensure processing stops.
133019625d8cSopenharmony_ci    ///
133119625d8cSopenharmony_ci    /// **WARNING**: Take caution when using this setting combined with another argument using
133219625d8cSopenharmony_ci    /// [`Arg::num_args`], as this becomes ambiguous `$ prog --arg -- -- val`. All
133319625d8cSopenharmony_ci    /// three `--, --, val` will be values when the user may have thought the second `--` would
133419625d8cSopenharmony_ci    /// constitute the normal, "Only positional args follow" idiom.
133519625d8cSopenharmony_ci    ///
133619625d8cSopenharmony_ci    /// # Examples
133719625d8cSopenharmony_ci    ///
133819625d8cSopenharmony_ci    /// ```rust
133919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
134019625d8cSopenharmony_ci    /// let m = Command::new("prog")
134119625d8cSopenharmony_ci    ///     .arg(Arg::new("pat")
134219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
134319625d8cSopenharmony_ci    ///         .allow_hyphen_values(true)
134419625d8cSopenharmony_ci    ///         .long("pattern"))
134519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
134619625d8cSopenharmony_ci    ///         "prog", "--pattern", "-file"
134719625d8cSopenharmony_ci    ///     ]);
134819625d8cSopenharmony_ci    ///
134919625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("pat").unwrap(), "-file");
135019625d8cSopenharmony_ci    /// ```
135119625d8cSopenharmony_ci    ///
135219625d8cSopenharmony_ci    /// Not setting `Arg::allow_hyphen_values(true)` and supplying a value which starts with a
135319625d8cSopenharmony_ci    /// hyphen is an error.
135419625d8cSopenharmony_ci    ///
135519625d8cSopenharmony_ci    /// ```rust
135619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
135719625d8cSopenharmony_ci    /// let res = Command::new("prog")
135819625d8cSopenharmony_ci    ///     .arg(Arg::new("pat")
135919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
136019625d8cSopenharmony_ci    ///         .long("pattern"))
136119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
136219625d8cSopenharmony_ci    ///         "prog", "--pattern", "-file"
136319625d8cSopenharmony_ci    ///     ]);
136419625d8cSopenharmony_ci    ///
136519625d8cSopenharmony_ci    /// assert!(res.is_err());
136619625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);
136719625d8cSopenharmony_ci    /// ```
136819625d8cSopenharmony_ci    /// [`Arg::num_args(1)`]: Arg::num_args()
136919625d8cSopenharmony_ci    #[inline]
137019625d8cSopenharmony_ci    #[must_use]
137119625d8cSopenharmony_ci    pub fn allow_hyphen_values(self, yes: bool) -> Self {
137219625d8cSopenharmony_ci        if yes {
137319625d8cSopenharmony_ci            self.setting(ArgSettings::AllowHyphenValues)
137419625d8cSopenharmony_ci        } else {
137519625d8cSopenharmony_ci            self.unset_setting(ArgSettings::AllowHyphenValues)
137619625d8cSopenharmony_ci        }
137719625d8cSopenharmony_ci    }
137819625d8cSopenharmony_ci
137919625d8cSopenharmony_ci    /// Allows negative numbers to pass as values.
138019625d8cSopenharmony_ci    ///
138119625d8cSopenharmony_ci    /// This is similar to [`Arg::allow_hyphen_values`] except that it only allows numbers,
138219625d8cSopenharmony_ci    /// all other undefined leading hyphens will fail to parse.
138319625d8cSopenharmony_ci    ///
138419625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
138519625d8cSopenharmony_ci    ///
138619625d8cSopenharmony_ci    /// # Examples
138719625d8cSopenharmony_ci    ///
138819625d8cSopenharmony_ci    /// ```rust
138919625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
139019625d8cSopenharmony_ci    /// let res = Command::new("myprog")
139119625d8cSopenharmony_ci    ///     .arg(Arg::new("num").allow_negative_numbers(true))
139219625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
139319625d8cSopenharmony_ci    ///         "myprog", "-20"
139419625d8cSopenharmony_ci    ///     ]);
139519625d8cSopenharmony_ci    /// assert!(res.is_ok());
139619625d8cSopenharmony_ci    /// let m = res.unwrap();
139719625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("num").unwrap(), "-20");
139819625d8cSopenharmony_ci    /// ```
139919625d8cSopenharmony_ci    #[inline]
140019625d8cSopenharmony_ci    pub fn allow_negative_numbers(self, yes: bool) -> Self {
140119625d8cSopenharmony_ci        if yes {
140219625d8cSopenharmony_ci            self.setting(ArgSettings::AllowNegativeNumbers)
140319625d8cSopenharmony_ci        } else {
140419625d8cSopenharmony_ci            self.unset_setting(ArgSettings::AllowNegativeNumbers)
140519625d8cSopenharmony_ci        }
140619625d8cSopenharmony_ci    }
140719625d8cSopenharmony_ci
140819625d8cSopenharmony_ci    /// Requires that options use the `--option=val` syntax
140919625d8cSopenharmony_ci    ///
141019625d8cSopenharmony_ci    /// i.e. an equals between the option and associated value.
141119625d8cSopenharmony_ci    ///
141219625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
141319625d8cSopenharmony_ci    ///
141419625d8cSopenharmony_ci    /// # Examples
141519625d8cSopenharmony_ci    ///
141619625d8cSopenharmony_ci    /// Setting `require_equals` requires that the option have an equals sign between
141719625d8cSopenharmony_ci    /// it and the associated value.
141819625d8cSopenharmony_ci    ///
141919625d8cSopenharmony_ci    /// ```rust
142019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
142119625d8cSopenharmony_ci    /// let res = Command::new("prog")
142219625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
142319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
142419625d8cSopenharmony_ci    ///         .require_equals(true)
142519625d8cSopenharmony_ci    ///         .long("config"))
142619625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
142719625d8cSopenharmony_ci    ///         "prog", "--config=file.conf"
142819625d8cSopenharmony_ci    ///     ]);
142919625d8cSopenharmony_ci    ///
143019625d8cSopenharmony_ci    /// assert!(res.is_ok());
143119625d8cSopenharmony_ci    /// ```
143219625d8cSopenharmony_ci    ///
143319625d8cSopenharmony_ci    /// Setting `require_equals` and *not* supplying the equals will cause an
143419625d8cSopenharmony_ci    /// error.
143519625d8cSopenharmony_ci    ///
143619625d8cSopenharmony_ci    /// ```rust
143719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
143819625d8cSopenharmony_ci    /// let res = Command::new("prog")
143919625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
144019625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
144119625d8cSopenharmony_ci    ///         .require_equals(true)
144219625d8cSopenharmony_ci    ///         .long("config"))
144319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
144419625d8cSopenharmony_ci    ///         "prog", "--config", "file.conf"
144519625d8cSopenharmony_ci    ///     ]);
144619625d8cSopenharmony_ci    ///
144719625d8cSopenharmony_ci    /// assert!(res.is_err());
144819625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals);
144919625d8cSopenharmony_ci    /// ```
145019625d8cSopenharmony_ci    #[inline]
145119625d8cSopenharmony_ci    #[must_use]
145219625d8cSopenharmony_ci    pub fn require_equals(self, yes: bool) -> Self {
145319625d8cSopenharmony_ci        if yes {
145419625d8cSopenharmony_ci            self.setting(ArgSettings::RequireEquals)
145519625d8cSopenharmony_ci        } else {
145619625d8cSopenharmony_ci            self.unset_setting(ArgSettings::RequireEquals)
145719625d8cSopenharmony_ci        }
145819625d8cSopenharmony_ci    }
145919625d8cSopenharmony_ci
146019625d8cSopenharmony_ci    #[doc(hidden)]
146119625d8cSopenharmony_ci    #[cfg_attr(
146219625d8cSopenharmony_ci        feature = "deprecated",
146319625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::value_delimiter`")
146419625d8cSopenharmony_ci    )]
146519625d8cSopenharmony_ci    pub fn use_value_delimiter(mut self, yes: bool) -> Self {
146619625d8cSopenharmony_ci        if yes {
146719625d8cSopenharmony_ci            self.val_delim.get_or_insert(',');
146819625d8cSopenharmony_ci        } else {
146919625d8cSopenharmony_ci            self.val_delim = None;
147019625d8cSopenharmony_ci        }
147119625d8cSopenharmony_ci        self
147219625d8cSopenharmony_ci    }
147319625d8cSopenharmony_ci
147419625d8cSopenharmony_ci    /// Allow grouping of multiple values via a delimiter.
147519625d8cSopenharmony_ci    ///
147619625d8cSopenharmony_ci    /// i.e. should `--option=val1,val2,val3` be parsed as three values (`val1`, `val2`,
147719625d8cSopenharmony_ci    /// and `val3`) or as a single value (`val1,val2,val3`). Defaults to using `,` (comma) as the
147819625d8cSopenharmony_ci    /// value delimiter for all arguments that accept values (options and positional arguments)
147919625d8cSopenharmony_ci    ///
148019625d8cSopenharmony_ci    /// **NOTE:** implicitly sets [`Arg::action(ArgAction::Set)`]
148119625d8cSopenharmony_ci    ///
148219625d8cSopenharmony_ci    /// # Examples
148319625d8cSopenharmony_ci    ///
148419625d8cSopenharmony_ci    /// ```rust
148519625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
148619625d8cSopenharmony_ci    /// let m = Command::new("prog")
148719625d8cSopenharmony_ci    ///     .arg(Arg::new("config")
148819625d8cSopenharmony_ci    ///         .short('c')
148919625d8cSopenharmony_ci    ///         .long("config")
149019625d8cSopenharmony_ci    ///         .value_delimiter(','))
149119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
149219625d8cSopenharmony_ci    ///         "prog", "--config=val1,val2,val3"
149319625d8cSopenharmony_ci    ///     ]);
149419625d8cSopenharmony_ci    ///
149519625d8cSopenharmony_ci    /// assert_eq!(m.get_many::<String>("config").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"])
149619625d8cSopenharmony_ci    /// ```
149719625d8cSopenharmony_ci    /// [`Arg::value_delimiter(',')`]: Arg::value_delimiter()
149819625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
149919625d8cSopenharmony_ci    #[inline]
150019625d8cSopenharmony_ci    #[must_use]
150119625d8cSopenharmony_ci    pub fn value_delimiter(mut self, d: impl IntoResettable<char>) -> Self {
150219625d8cSopenharmony_ci        self.val_delim = d.into_resettable().into_option();
150319625d8cSopenharmony_ci        self
150419625d8cSopenharmony_ci    }
150519625d8cSopenharmony_ci
150619625d8cSopenharmony_ci    /// Sentinel to **stop** parsing multiple values of a given argument.
150719625d8cSopenharmony_ci    ///
150819625d8cSopenharmony_ci    /// By default when
150919625d8cSopenharmony_ci    /// one sets [`num_args(1..)`] on an argument, clap will continue parsing values for that
151019625d8cSopenharmony_ci    /// argument until it reaches another valid argument, or one of the other more specific settings
151119625d8cSopenharmony_ci    /// for multiple values is used (such as [`num_args`]).
151219625d8cSopenharmony_ci    ///
151319625d8cSopenharmony_ci    /// **NOTE:** This setting only applies to [options] and [positional arguments]
151419625d8cSopenharmony_ci    ///
151519625d8cSopenharmony_ci    /// **NOTE:** When the terminator is passed in on the command line, it is **not** stored as one
151619625d8cSopenharmony_ci    /// of the values
151719625d8cSopenharmony_ci    ///
151819625d8cSopenharmony_ci    /// # Examples
151919625d8cSopenharmony_ci    ///
152019625d8cSopenharmony_ci    /// ```rust
152119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
152219625d8cSopenharmony_ci    /// Arg::new("vals")
152319625d8cSopenharmony_ci    ///     .action(ArgAction::Set)
152419625d8cSopenharmony_ci    ///     .num_args(1..)
152519625d8cSopenharmony_ci    ///     .value_terminator(";")
152619625d8cSopenharmony_ci    /// # ;
152719625d8cSopenharmony_ci    /// ```
152819625d8cSopenharmony_ci    ///
152919625d8cSopenharmony_ci    /// The following example uses two arguments, a sequence of commands, and the location in which
153019625d8cSopenharmony_ci    /// to perform them
153119625d8cSopenharmony_ci    ///
153219625d8cSopenharmony_ci    /// ```rust
153319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
153419625d8cSopenharmony_ci    /// let m = Command::new("prog")
153519625d8cSopenharmony_ci    ///     .arg(Arg::new("cmds")
153619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
153719625d8cSopenharmony_ci    ///         .num_args(1..)
153819625d8cSopenharmony_ci    ///         .allow_hyphen_values(true)
153919625d8cSopenharmony_ci    ///         .value_terminator(";"))
154019625d8cSopenharmony_ci    ///     .arg(Arg::new("location"))
154119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
154219625d8cSopenharmony_ci    ///         "prog", "find", "-type", "f", "-name", "special", ";", "/home/clap"
154319625d8cSopenharmony_ci    ///     ]);
154419625d8cSopenharmony_ci    /// let cmds: Vec<_> = m.get_many::<String>("cmds").unwrap().collect();
154519625d8cSopenharmony_ci    /// assert_eq!(&cmds, &["find", "-type", "f", "-name", "special"]);
154619625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("location").unwrap(), "/home/clap");
154719625d8cSopenharmony_ci    /// ```
154819625d8cSopenharmony_ci    /// [options]: Arg::action
154919625d8cSopenharmony_ci    /// [positional arguments]: Arg::index()
155019625d8cSopenharmony_ci    /// [`num_args(1..)`]: Arg::num_args()
155119625d8cSopenharmony_ci    /// [`num_args`]: Arg::num_args()
155219625d8cSopenharmony_ci    #[inline]
155319625d8cSopenharmony_ci    #[must_use]
155419625d8cSopenharmony_ci    pub fn value_terminator(mut self, term: impl IntoResettable<Str>) -> Self {
155519625d8cSopenharmony_ci        self.terminator = term.into_resettable().into_option();
155619625d8cSopenharmony_ci        self
155719625d8cSopenharmony_ci    }
155819625d8cSopenharmony_ci
155919625d8cSopenharmony_ci    /// Consume all following arguments.
156019625d8cSopenharmony_ci    ///
156119625d8cSopenharmony_ci    /// Do not be parse them individually, but rather pass them in entirety.
156219625d8cSopenharmony_ci    ///
156319625d8cSopenharmony_ci    /// It is worth noting that setting this requires all values to come after a `--` to indicate
156419625d8cSopenharmony_ci    /// they should all be captured. For example:
156519625d8cSopenharmony_ci    ///
156619625d8cSopenharmony_ci    /// ```text
156719625d8cSopenharmony_ci    /// --foo something -- -v -v -v -b -b -b --baz -q -u -x
156819625d8cSopenharmony_ci    /// ```
156919625d8cSopenharmony_ci    ///
157019625d8cSopenharmony_ci    /// Will result in everything after `--` to be considered one raw argument. This behavior
157119625d8cSopenharmony_ci    /// may not be exactly what you are expecting and using [`crate::Command::trailing_var_arg`]
157219625d8cSopenharmony_ci    /// may be more appropriate.
157319625d8cSopenharmony_ci    ///
157419625d8cSopenharmony_ci    /// **NOTE:** Implicitly sets [`Arg::action(ArgAction::Set)`] [`Arg::num_args(1..)`],
157519625d8cSopenharmony_ci    /// [`Arg::allow_hyphen_values(true)`], and [`Arg::last(true)`] when set to `true`.
157619625d8cSopenharmony_ci    ///
157719625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
157819625d8cSopenharmony_ci    /// [`Arg::num_args(1..)`]: Arg::num_args()
157919625d8cSopenharmony_ci    /// [`Arg::allow_hyphen_values(true)`]: Arg::allow_hyphen_values()
158019625d8cSopenharmony_ci    /// [`Arg::last(true)`]: Arg::last()
158119625d8cSopenharmony_ci    #[inline]
158219625d8cSopenharmony_ci    #[must_use]
158319625d8cSopenharmony_ci    pub fn raw(mut self, yes: bool) -> Self {
158419625d8cSopenharmony_ci        if yes {
158519625d8cSopenharmony_ci            self.num_vals.get_or_insert_with(|| (1..).into());
158619625d8cSopenharmony_ci        }
158719625d8cSopenharmony_ci        self.allow_hyphen_values(yes).last(yes)
158819625d8cSopenharmony_ci    }
158919625d8cSopenharmony_ci
159019625d8cSopenharmony_ci    /// Value for the argument when not present.
159119625d8cSopenharmony_ci    ///
159219625d8cSopenharmony_ci    /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::contains_id`] will
159319625d8cSopenharmony_ci    /// still return `true`. If you wish to determine whether the argument was used at runtime or
159419625d8cSopenharmony_ci    /// not, consider [`ArgMatches::value_source`][crate::ArgMatches::value_source].
159519625d8cSopenharmony_ci    ///
159619625d8cSopenharmony_ci    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value_if`] but slightly
159719625d8cSopenharmony_ci    /// different. `Arg::default_value` *only* takes effect when the user has not provided this arg
159819625d8cSopenharmony_ci    /// at runtime. `Arg::default_value_if` however only takes effect when the user has not provided
159919625d8cSopenharmony_ci    /// a value at runtime **and** these other conditions are met as well. If you have set
160019625d8cSopenharmony_ci    /// `Arg::default_value` and `Arg::default_value_if`, and the user **did not** provide this arg
160119625d8cSopenharmony_ci    /// at runtime, nor were the conditions met for `Arg::default_value_if`, the `Arg::default_value`
160219625d8cSopenharmony_ci    /// will be applied.
160319625d8cSopenharmony_ci    ///
160419625d8cSopenharmony_ci    /// **NOTE:** This implicitly sets [`Arg::action(ArgAction::Set)`].
160519625d8cSopenharmony_ci    ///
160619625d8cSopenharmony_ci    /// # Examples
160719625d8cSopenharmony_ci    ///
160819625d8cSopenharmony_ci    /// First we use the default value without providing any value at runtime.
160919625d8cSopenharmony_ci    ///
161019625d8cSopenharmony_ci    /// ```rust
161119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, parser::ValueSource};
161219625d8cSopenharmony_ci    /// let m = Command::new("prog")
161319625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
161419625d8cSopenharmony_ci    ///         .long("myopt")
161519625d8cSopenharmony_ci    ///         .default_value("myval"))
161619625d8cSopenharmony_ci    ///     .get_matches_from(vec![
161719625d8cSopenharmony_ci    ///         "prog"
161819625d8cSopenharmony_ci    ///     ]);
161919625d8cSopenharmony_ci    ///
162019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("opt").unwrap(), "myval");
162119625d8cSopenharmony_ci    /// assert!(m.contains_id("opt"));
162219625d8cSopenharmony_ci    /// assert_eq!(m.value_source("opt"), Some(ValueSource::DefaultValue));
162319625d8cSopenharmony_ci    /// ```
162419625d8cSopenharmony_ci    ///
162519625d8cSopenharmony_ci    /// Next we provide a value at runtime to override the default.
162619625d8cSopenharmony_ci    ///
162719625d8cSopenharmony_ci    /// ```rust
162819625d8cSopenharmony_ci    /// # use clap::{Command, Arg, parser::ValueSource};
162919625d8cSopenharmony_ci    /// let m = Command::new("prog")
163019625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
163119625d8cSopenharmony_ci    ///         .long("myopt")
163219625d8cSopenharmony_ci    ///         .default_value("myval"))
163319625d8cSopenharmony_ci    ///     .get_matches_from(vec![
163419625d8cSopenharmony_ci    ///         "prog", "--myopt=non_default"
163519625d8cSopenharmony_ci    ///     ]);
163619625d8cSopenharmony_ci    ///
163719625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("opt").unwrap(), "non_default");
163819625d8cSopenharmony_ci    /// assert!(m.contains_id("opt"));
163919625d8cSopenharmony_ci    /// assert_eq!(m.value_source("opt"), Some(ValueSource::CommandLine));
164019625d8cSopenharmony_ci    /// ```
164119625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
164219625d8cSopenharmony_ci    /// [`ArgMatches::contains_id`]: crate::ArgMatches::contains_id()
164319625d8cSopenharmony_ci    /// [`Arg::default_value_if`]: Arg::default_value_if()
164419625d8cSopenharmony_ci    #[inline]
164519625d8cSopenharmony_ci    #[must_use]
164619625d8cSopenharmony_ci    pub fn default_value(mut self, val: impl IntoResettable<OsStr>) -> Self {
164719625d8cSopenharmony_ci        if let Some(val) = val.into_resettable().into_option() {
164819625d8cSopenharmony_ci            self.default_values([val])
164919625d8cSopenharmony_ci        } else {
165019625d8cSopenharmony_ci            self.default_vals.clear();
165119625d8cSopenharmony_ci            self
165219625d8cSopenharmony_ci        }
165319625d8cSopenharmony_ci    }
165419625d8cSopenharmony_ci
165519625d8cSopenharmony_ci    #[inline]
165619625d8cSopenharmony_ci    #[must_use]
165719625d8cSopenharmony_ci    #[doc(hidden)]
165819625d8cSopenharmony_ci    #[cfg_attr(
165919625d8cSopenharmony_ci        feature = "deprecated",
166019625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::default_value`")
166119625d8cSopenharmony_ci    )]
166219625d8cSopenharmony_ci    pub fn default_value_os(self, val: impl Into<OsStr>) -> Self {
166319625d8cSopenharmony_ci        self.default_values([val])
166419625d8cSopenharmony_ci    }
166519625d8cSopenharmony_ci
166619625d8cSopenharmony_ci    /// Value for the argument when not present.
166719625d8cSopenharmony_ci    ///
166819625d8cSopenharmony_ci    /// See [`Arg::default_value`].
166919625d8cSopenharmony_ci    ///
167019625d8cSopenharmony_ci    /// [`Arg::default_value`]: Arg::default_value()
167119625d8cSopenharmony_ci    #[inline]
167219625d8cSopenharmony_ci    #[must_use]
167319625d8cSopenharmony_ci    pub fn default_values(mut self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {
167419625d8cSopenharmony_ci        self.default_vals = vals.into_iter().map(|s| s.into()).collect();
167519625d8cSopenharmony_ci        self
167619625d8cSopenharmony_ci    }
167719625d8cSopenharmony_ci
167819625d8cSopenharmony_ci    #[inline]
167919625d8cSopenharmony_ci    #[must_use]
168019625d8cSopenharmony_ci    #[doc(hidden)]
168119625d8cSopenharmony_ci    #[cfg_attr(
168219625d8cSopenharmony_ci        feature = "deprecated",
168319625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::default_values`")
168419625d8cSopenharmony_ci    )]
168519625d8cSopenharmony_ci    pub fn default_values_os(self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {
168619625d8cSopenharmony_ci        self.default_values(vals)
168719625d8cSopenharmony_ci    }
168819625d8cSopenharmony_ci
168919625d8cSopenharmony_ci    /// Value for the argument when the flag is present but no value is specified.
169019625d8cSopenharmony_ci    ///
169119625d8cSopenharmony_ci    /// This configuration option is often used to give the user a shortcut and allow them to
169219625d8cSopenharmony_ci    /// efficiently specify an option argument without requiring an explicitly value. The `--color`
169319625d8cSopenharmony_ci    /// argument is a common example. By, supplying an default, such as `default_missing_value("always")`,
169419625d8cSopenharmony_ci    /// the user can quickly just add `--color` to the command line to produce the desired color output.
169519625d8cSopenharmony_ci    ///
169619625d8cSopenharmony_ci    /// **NOTE:** using this configuration option requires the use of the
169719625d8cSopenharmony_ci    /// [`.num_args(0..N)`][Arg::num_args] and the
169819625d8cSopenharmony_ci    /// [`.require_equals(true)`][Arg::require_equals] configuration option. These are required in
169919625d8cSopenharmony_ci    /// order to unambiguously determine what, if any, value was supplied for the argument.
170019625d8cSopenharmony_ci    ///
170119625d8cSopenharmony_ci    /// # Examples
170219625d8cSopenharmony_ci    ///
170319625d8cSopenharmony_ci    /// For POSIX style `--color`:
170419625d8cSopenharmony_ci    /// ```rust
170519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, parser::ValueSource};
170619625d8cSopenharmony_ci    /// fn cli() -> Command {
170719625d8cSopenharmony_ci    ///     Command::new("prog")
170819625d8cSopenharmony_ci    ///         .arg(Arg::new("color").long("color")
170919625d8cSopenharmony_ci    ///             .value_name("WHEN")
171019625d8cSopenharmony_ci    ///             .value_parser(["always", "auto", "never"])
171119625d8cSopenharmony_ci    ///             .default_value("auto")
171219625d8cSopenharmony_ci    ///             .num_args(0..=1)
171319625d8cSopenharmony_ci    ///             .require_equals(true)
171419625d8cSopenharmony_ci    ///             .default_missing_value("always")
171519625d8cSopenharmony_ci    ///             .help("Specify WHEN to colorize output.")
171619625d8cSopenharmony_ci    ///         )
171719625d8cSopenharmony_ci    /// }
171819625d8cSopenharmony_ci    ///
171919625d8cSopenharmony_ci    /// // first, we'll provide no arguments
172019625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
172119625d8cSopenharmony_ci    ///         "prog"
172219625d8cSopenharmony_ci    ///     ]);
172319625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("color").unwrap(), "auto");
172419625d8cSopenharmony_ci    /// assert_eq!(m.value_source("color"), Some(ValueSource::DefaultValue));
172519625d8cSopenharmony_ci    ///
172619625d8cSopenharmony_ci    /// // next, we'll provide a runtime value to override the default (as usually done).
172719625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
172819625d8cSopenharmony_ci    ///         "prog", "--color=never"
172919625d8cSopenharmony_ci    ///     ]);
173019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("color").unwrap(), "never");
173119625d8cSopenharmony_ci    /// assert_eq!(m.value_source("color"), Some(ValueSource::CommandLine));
173219625d8cSopenharmony_ci    ///
173319625d8cSopenharmony_ci    /// // finally, we will use the shortcut and only provide the argument without a value.
173419625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
173519625d8cSopenharmony_ci    ///         "prog", "--color"
173619625d8cSopenharmony_ci    ///     ]);
173719625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("color").unwrap(), "always");
173819625d8cSopenharmony_ci    /// assert_eq!(m.value_source("color"), Some(ValueSource::CommandLine));
173919625d8cSopenharmony_ci    /// ```
174019625d8cSopenharmony_ci    ///
174119625d8cSopenharmony_ci    /// For bool literals:
174219625d8cSopenharmony_ci    /// ```rust
174319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, parser::ValueSource, value_parser};
174419625d8cSopenharmony_ci    /// fn cli() -> Command {
174519625d8cSopenharmony_ci    ///     Command::new("prog")
174619625d8cSopenharmony_ci    ///         .arg(Arg::new("create").long("create")
174719625d8cSopenharmony_ci    ///             .value_name("BOOL")
174819625d8cSopenharmony_ci    ///             .value_parser(value_parser!(bool))
174919625d8cSopenharmony_ci    ///             .num_args(0..=1)
175019625d8cSopenharmony_ci    ///             .require_equals(true)
175119625d8cSopenharmony_ci    ///             .default_missing_value("true")
175219625d8cSopenharmony_ci    ///         )
175319625d8cSopenharmony_ci    /// }
175419625d8cSopenharmony_ci    ///
175519625d8cSopenharmony_ci    /// // first, we'll provide no arguments
175619625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
175719625d8cSopenharmony_ci    ///         "prog"
175819625d8cSopenharmony_ci    ///     ]);
175919625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<bool>("create").copied(), None);
176019625d8cSopenharmony_ci    ///
176119625d8cSopenharmony_ci    /// // next, we'll provide a runtime value to override the default (as usually done).
176219625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
176319625d8cSopenharmony_ci    ///         "prog", "--create=false"
176419625d8cSopenharmony_ci    ///     ]);
176519625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<bool>("create").copied(), Some(false));
176619625d8cSopenharmony_ci    /// assert_eq!(m.value_source("create"), Some(ValueSource::CommandLine));
176719625d8cSopenharmony_ci    ///
176819625d8cSopenharmony_ci    /// // finally, we will use the shortcut and only provide the argument without a value.
176919625d8cSopenharmony_ci    /// let m  = cli().get_matches_from(vec![
177019625d8cSopenharmony_ci    ///         "prog", "--create"
177119625d8cSopenharmony_ci    ///     ]);
177219625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<bool>("create").copied(), Some(true));
177319625d8cSopenharmony_ci    /// assert_eq!(m.value_source("create"), Some(ValueSource::CommandLine));
177419625d8cSopenharmony_ci    /// ```
177519625d8cSopenharmony_ci    ///
177619625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
177719625d8cSopenharmony_ci    /// [`Arg::default_value`]: Arg::default_value()
177819625d8cSopenharmony_ci    #[inline]
177919625d8cSopenharmony_ci    #[must_use]
178019625d8cSopenharmony_ci    pub fn default_missing_value(mut self, val: impl IntoResettable<OsStr>) -> Self {
178119625d8cSopenharmony_ci        if let Some(val) = val.into_resettable().into_option() {
178219625d8cSopenharmony_ci            self.default_missing_values_os([val])
178319625d8cSopenharmony_ci        } else {
178419625d8cSopenharmony_ci            self.default_missing_vals.clear();
178519625d8cSopenharmony_ci            self
178619625d8cSopenharmony_ci        }
178719625d8cSopenharmony_ci    }
178819625d8cSopenharmony_ci
178919625d8cSopenharmony_ci    /// Value for the argument when the flag is present but no value is specified.
179019625d8cSopenharmony_ci    ///
179119625d8cSopenharmony_ci    /// See [`Arg::default_missing_value`].
179219625d8cSopenharmony_ci    ///
179319625d8cSopenharmony_ci    /// [`Arg::default_missing_value`]: Arg::default_missing_value()
179419625d8cSopenharmony_ci    /// [`OsStr`]: std::ffi::OsStr
179519625d8cSopenharmony_ci    #[inline]
179619625d8cSopenharmony_ci    #[must_use]
179719625d8cSopenharmony_ci    pub fn default_missing_value_os(self, val: impl Into<OsStr>) -> Self {
179819625d8cSopenharmony_ci        self.default_missing_values_os([val])
179919625d8cSopenharmony_ci    }
180019625d8cSopenharmony_ci
180119625d8cSopenharmony_ci    /// Value for the argument when the flag is present but no value is specified.
180219625d8cSopenharmony_ci    ///
180319625d8cSopenharmony_ci    /// See [`Arg::default_missing_value`].
180419625d8cSopenharmony_ci    ///
180519625d8cSopenharmony_ci    /// [`Arg::default_missing_value`]: Arg::default_missing_value()
180619625d8cSopenharmony_ci    #[inline]
180719625d8cSopenharmony_ci    #[must_use]
180819625d8cSopenharmony_ci    pub fn default_missing_values(self, vals: impl IntoIterator<Item = impl Into<OsStr>>) -> Self {
180919625d8cSopenharmony_ci        self.default_missing_values_os(vals)
181019625d8cSopenharmony_ci    }
181119625d8cSopenharmony_ci
181219625d8cSopenharmony_ci    /// Value for the argument when the flag is present but no value is specified.
181319625d8cSopenharmony_ci    ///
181419625d8cSopenharmony_ci    /// See [`Arg::default_missing_values`].
181519625d8cSopenharmony_ci    ///
181619625d8cSopenharmony_ci    /// [`Arg::default_missing_values`]: Arg::default_missing_values()
181719625d8cSopenharmony_ci    /// [`OsStr`]: std::ffi::OsStr
181819625d8cSopenharmony_ci    #[inline]
181919625d8cSopenharmony_ci    #[must_use]
182019625d8cSopenharmony_ci    pub fn default_missing_values_os(
182119625d8cSopenharmony_ci        mut self,
182219625d8cSopenharmony_ci        vals: impl IntoIterator<Item = impl Into<OsStr>>,
182319625d8cSopenharmony_ci    ) -> Self {
182419625d8cSopenharmony_ci        self.default_missing_vals = vals.into_iter().map(|s| s.into()).collect();
182519625d8cSopenharmony_ci        self
182619625d8cSopenharmony_ci    }
182719625d8cSopenharmony_ci
182819625d8cSopenharmony_ci    /// Read from `name` environment variable when argument is not present.
182919625d8cSopenharmony_ci    ///
183019625d8cSopenharmony_ci    /// If it is not present in the environment, then default
183119625d8cSopenharmony_ci    /// rules will apply.
183219625d8cSopenharmony_ci    ///
183319625d8cSopenharmony_ci    /// If user sets the argument in the environment:
183419625d8cSopenharmony_ci    /// - When [`Arg::action(ArgAction::Set)`] is not set, the flag is considered raised.
183519625d8cSopenharmony_ci    /// - When [`Arg::action(ArgAction::Set)`] is set,
183619625d8cSopenharmony_ci    ///   [`ArgMatches::get_one`][crate::ArgMatches::get_one] will
183719625d8cSopenharmony_ci    ///   return value of the environment variable.
183819625d8cSopenharmony_ci    ///
183919625d8cSopenharmony_ci    /// If user doesn't set the argument in the environment:
184019625d8cSopenharmony_ci    /// - When [`Arg::action(ArgAction::Set)`] is not set, the flag is considered off.
184119625d8cSopenharmony_ci    /// - When [`Arg::action(ArgAction::Set)`] is set,
184219625d8cSopenharmony_ci    ///   [`ArgMatches::get_one`][crate::ArgMatches::get_one] will
184319625d8cSopenharmony_ci    ///   return the default specified.
184419625d8cSopenharmony_ci    ///
184519625d8cSopenharmony_ci    /// # Examples
184619625d8cSopenharmony_ci    ///
184719625d8cSopenharmony_ci    /// In this example, we show the variable coming from the environment:
184819625d8cSopenharmony_ci    ///
184919625d8cSopenharmony_ci    /// ```rust
185019625d8cSopenharmony_ci    /// # use std::env;
185119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
185219625d8cSopenharmony_ci    ///
185319625d8cSopenharmony_ci    /// env::set_var("MY_FLAG", "env");
185419625d8cSopenharmony_ci    ///
185519625d8cSopenharmony_ci    /// let m = Command::new("prog")
185619625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
185719625d8cSopenharmony_ci    ///         .long("flag")
185819625d8cSopenharmony_ci    ///         .env("MY_FLAG")
185919625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
186019625d8cSopenharmony_ci    ///     .get_matches_from(vec![
186119625d8cSopenharmony_ci    ///         "prog"
186219625d8cSopenharmony_ci    ///     ]);
186319625d8cSopenharmony_ci    ///
186419625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("flag").unwrap(), "env");
186519625d8cSopenharmony_ci    /// ```
186619625d8cSopenharmony_ci    ///
186719625d8cSopenharmony_ci    /// In this example, because `prog` is a flag that accepts an optional, case-insensitive
186819625d8cSopenharmony_ci    /// boolean literal.
186919625d8cSopenharmony_ci    ///
187019625d8cSopenharmony_ci    /// Note that the value parser controls how flags are parsed.  In this case we've selected
187119625d8cSopenharmony_ci    /// [`FalseyValueParser`][crate::builder::FalseyValueParser].  A `false` literal is `n`, `no`,
187219625d8cSopenharmony_ci    /// `f`, `false`, `off` or `0`.  An absent environment variable will also be considered as
187319625d8cSopenharmony_ci    /// `false`.  Anything else will considered as `true`.
187419625d8cSopenharmony_ci    ///
187519625d8cSopenharmony_ci    /// ```rust
187619625d8cSopenharmony_ci    /// # use std::env;
187719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
187819625d8cSopenharmony_ci    /// # use clap::builder::FalseyValueParser;
187919625d8cSopenharmony_ci    ///
188019625d8cSopenharmony_ci    /// env::set_var("TRUE_FLAG", "true");
188119625d8cSopenharmony_ci    /// env::set_var("FALSE_FLAG", "0");
188219625d8cSopenharmony_ci    ///
188319625d8cSopenharmony_ci    /// let m = Command::new("prog")
188419625d8cSopenharmony_ci    ///     .arg(Arg::new("true_flag")
188519625d8cSopenharmony_ci    ///         .long("true_flag")
188619625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
188719625d8cSopenharmony_ci    ///         .value_parser(FalseyValueParser::new())
188819625d8cSopenharmony_ci    ///         .env("TRUE_FLAG"))
188919625d8cSopenharmony_ci    ///     .arg(Arg::new("false_flag")
189019625d8cSopenharmony_ci    ///         .long("false_flag")
189119625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
189219625d8cSopenharmony_ci    ///         .value_parser(FalseyValueParser::new())
189319625d8cSopenharmony_ci    ///         .env("FALSE_FLAG"))
189419625d8cSopenharmony_ci    ///     .arg(Arg::new("absent_flag")
189519625d8cSopenharmony_ci    ///         .long("absent_flag")
189619625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
189719625d8cSopenharmony_ci    ///         .value_parser(FalseyValueParser::new())
189819625d8cSopenharmony_ci    ///         .env("ABSENT_FLAG"))
189919625d8cSopenharmony_ci    ///     .get_matches_from(vec![
190019625d8cSopenharmony_ci    ///         "prog"
190119625d8cSopenharmony_ci    ///     ]);
190219625d8cSopenharmony_ci    ///
190319625d8cSopenharmony_ci    /// assert!(m.get_flag("true_flag"));
190419625d8cSopenharmony_ci    /// assert!(!m.get_flag("false_flag"));
190519625d8cSopenharmony_ci    /// assert!(!m.get_flag("absent_flag"));
190619625d8cSopenharmony_ci    /// ```
190719625d8cSopenharmony_ci    ///
190819625d8cSopenharmony_ci    /// In this example, we show the variable coming from an option on the CLI:
190919625d8cSopenharmony_ci    ///
191019625d8cSopenharmony_ci    /// ```rust
191119625d8cSopenharmony_ci    /// # use std::env;
191219625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
191319625d8cSopenharmony_ci    ///
191419625d8cSopenharmony_ci    /// env::set_var("MY_FLAG", "env");
191519625d8cSopenharmony_ci    ///
191619625d8cSopenharmony_ci    /// let m = Command::new("prog")
191719625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
191819625d8cSopenharmony_ci    ///         .long("flag")
191919625d8cSopenharmony_ci    ///         .env("MY_FLAG")
192019625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
192119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
192219625d8cSopenharmony_ci    ///         "prog", "--flag", "opt"
192319625d8cSopenharmony_ci    ///     ]);
192419625d8cSopenharmony_ci    ///
192519625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("flag").unwrap(), "opt");
192619625d8cSopenharmony_ci    /// ```
192719625d8cSopenharmony_ci    ///
192819625d8cSopenharmony_ci    /// In this example, we show the variable coming from the environment even with the
192919625d8cSopenharmony_ci    /// presence of a default:
193019625d8cSopenharmony_ci    ///
193119625d8cSopenharmony_ci    /// ```rust
193219625d8cSopenharmony_ci    /// # use std::env;
193319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
193419625d8cSopenharmony_ci    ///
193519625d8cSopenharmony_ci    /// env::set_var("MY_FLAG", "env");
193619625d8cSopenharmony_ci    ///
193719625d8cSopenharmony_ci    /// let m = Command::new("prog")
193819625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
193919625d8cSopenharmony_ci    ///         .long("flag")
194019625d8cSopenharmony_ci    ///         .env("MY_FLAG")
194119625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
194219625d8cSopenharmony_ci    ///         .default_value("default"))
194319625d8cSopenharmony_ci    ///     .get_matches_from(vec![
194419625d8cSopenharmony_ci    ///         "prog"
194519625d8cSopenharmony_ci    ///     ]);
194619625d8cSopenharmony_ci    ///
194719625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("flag").unwrap(), "env");
194819625d8cSopenharmony_ci    /// ```
194919625d8cSopenharmony_ci    ///
195019625d8cSopenharmony_ci    /// In this example, we show the use of multiple values in a single environment variable:
195119625d8cSopenharmony_ci    ///
195219625d8cSopenharmony_ci    /// ```rust
195319625d8cSopenharmony_ci    /// # use std::env;
195419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
195519625d8cSopenharmony_ci    ///
195619625d8cSopenharmony_ci    /// env::set_var("MY_FLAG_MULTI", "env1,env2");
195719625d8cSopenharmony_ci    ///
195819625d8cSopenharmony_ci    /// let m = Command::new("prog")
195919625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
196019625d8cSopenharmony_ci    ///         .long("flag")
196119625d8cSopenharmony_ci    ///         .env("MY_FLAG_MULTI")
196219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
196319625d8cSopenharmony_ci    ///         .num_args(1..)
196419625d8cSopenharmony_ci    ///         .value_delimiter(','))
196519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
196619625d8cSopenharmony_ci    ///         "prog"
196719625d8cSopenharmony_ci    ///     ]);
196819625d8cSopenharmony_ci    ///
196919625d8cSopenharmony_ci    /// assert_eq!(m.get_many::<String>("flag").unwrap().collect::<Vec<_>>(), vec!["env1", "env2"]);
197019625d8cSopenharmony_ci    /// ```
197119625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
197219625d8cSopenharmony_ci    /// [`Arg::value_delimiter(',')`]: Arg::value_delimiter()
197319625d8cSopenharmony_ci    #[cfg(feature = "env")]
197419625d8cSopenharmony_ci    #[inline]
197519625d8cSopenharmony_ci    #[must_use]
197619625d8cSopenharmony_ci    pub fn env(mut self, name: impl IntoResettable<OsStr>) -> Self {
197719625d8cSopenharmony_ci        if let Some(name) = name.into_resettable().into_option() {
197819625d8cSopenharmony_ci            let value = env::var_os(&name);
197919625d8cSopenharmony_ci            self.env = Some((name, value));
198019625d8cSopenharmony_ci        } else {
198119625d8cSopenharmony_ci            self.env = None;
198219625d8cSopenharmony_ci        }
198319625d8cSopenharmony_ci        self
198419625d8cSopenharmony_ci    }
198519625d8cSopenharmony_ci
198619625d8cSopenharmony_ci    #[cfg(feature = "env")]
198719625d8cSopenharmony_ci    #[doc(hidden)]
198819625d8cSopenharmony_ci    #[cfg_attr(
198919625d8cSopenharmony_ci        feature = "deprecated",
199019625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::env`")
199119625d8cSopenharmony_ci    )]
199219625d8cSopenharmony_ci    pub fn env_os(self, name: impl Into<OsStr>) -> Self {
199319625d8cSopenharmony_ci        self.env(name)
199419625d8cSopenharmony_ci    }
199519625d8cSopenharmony_ci}
199619625d8cSopenharmony_ci
199719625d8cSopenharmony_ci/// # Help
199819625d8cSopenharmony_ciimpl Arg {
199919625d8cSopenharmony_ci    /// Sets the description of the argument for short help (`-h`).
200019625d8cSopenharmony_ci    ///
200119625d8cSopenharmony_ci    /// Typically, this is a short (one line) description of the arg.
200219625d8cSopenharmony_ci    ///
200319625d8cSopenharmony_ci    /// If [`Arg::long_help`] is not specified, this message will be displayed for `--help`.
200419625d8cSopenharmony_ci    ///
200519625d8cSopenharmony_ci    /// **NOTE:** Only `Arg::help` is used in completion script generation in order to be concise
200619625d8cSopenharmony_ci    ///
200719625d8cSopenharmony_ci    /// # Examples
200819625d8cSopenharmony_ci    ///
200919625d8cSopenharmony_ci    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
201019625d8cSopenharmony_ci    /// include a newline in the help text and have the following text be properly aligned with all
201119625d8cSopenharmony_ci    /// the other help text.
201219625d8cSopenharmony_ci    ///
201319625d8cSopenharmony_ci    /// Setting `help` displays a short message to the side of the argument when the user passes
201419625d8cSopenharmony_ci    /// `-h` or `--help` (by default).
201519625d8cSopenharmony_ci    ///
201619625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
201719625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
201819625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
201919625d8cSopenharmony_ci    /// let m = Command::new("prog")
202019625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
202119625d8cSopenharmony_ci    ///         .long("config")
202219625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
202319625d8cSopenharmony_ci    ///     .get_matches_from(vec![
202419625d8cSopenharmony_ci    ///         "prog", "--help"
202519625d8cSopenharmony_ci    ///     ]);
202619625d8cSopenharmony_ci    /// ```
202719625d8cSopenharmony_ci    ///
202819625d8cSopenharmony_ci    /// The above example displays
202919625d8cSopenharmony_ci    ///
203019625d8cSopenharmony_ci    /// ```notrust
203119625d8cSopenharmony_ci    /// helptest
203219625d8cSopenharmony_ci    ///
203319625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
203419625d8cSopenharmony_ci    ///
203519625d8cSopenharmony_ci    /// Options:
203619625d8cSopenharmony_ci    ///     --config     Some help text describing the --config arg
203719625d8cSopenharmony_ci    /// -h, --help       Print help information
203819625d8cSopenharmony_ci    /// -V, --version    Print version information
203919625d8cSopenharmony_ci    /// ```
204019625d8cSopenharmony_ci    /// [`Arg::long_help`]: Arg::long_help()
204119625d8cSopenharmony_ci    #[inline]
204219625d8cSopenharmony_ci    #[must_use]
204319625d8cSopenharmony_ci    pub fn help(mut self, h: impl IntoResettable<StyledStr>) -> Self {
204419625d8cSopenharmony_ci        self.help = h.into_resettable().into_option();
204519625d8cSopenharmony_ci        self
204619625d8cSopenharmony_ci    }
204719625d8cSopenharmony_ci
204819625d8cSopenharmony_ci    /// Sets the description of the argument for long help (`--help`).
204919625d8cSopenharmony_ci    ///
205019625d8cSopenharmony_ci    /// Typically this a more detailed (multi-line) message
205119625d8cSopenharmony_ci    /// that describes the arg.
205219625d8cSopenharmony_ci    ///
205319625d8cSopenharmony_ci    /// If [`Arg::help`] is not specified, this message will be displayed for `-h`.
205419625d8cSopenharmony_ci    ///
205519625d8cSopenharmony_ci    /// **NOTE:** Only [`Arg::help`] is used in completion script generation in order to be concise
205619625d8cSopenharmony_ci    ///
205719625d8cSopenharmony_ci    /// # Examples
205819625d8cSopenharmony_ci    ///
205919625d8cSopenharmony_ci    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
206019625d8cSopenharmony_ci    /// include a newline in the help text and have the following text be properly aligned with all
206119625d8cSopenharmony_ci    /// the other help text.
206219625d8cSopenharmony_ci    ///
206319625d8cSopenharmony_ci    /// Setting `help` displays a short message to the side of the argument when the user passes
206419625d8cSopenharmony_ci    /// `-h` or `--help` (by default).
206519625d8cSopenharmony_ci    ///
206619625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
206719625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
206819625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
206919625d8cSopenharmony_ci    /// let m = Command::new("prog")
207019625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
207119625d8cSopenharmony_ci    ///         .long("config")
207219625d8cSopenharmony_ci    ///         .long_help(
207319625d8cSopenharmony_ci    /// "The config file used by the myprog must be in JSON format
207419625d8cSopenharmony_ci    /// with only valid keys and may not contain other nonsense
207519625d8cSopenharmony_ci    /// that cannot be read by this program. Obviously I'm going on
207619625d8cSopenharmony_ci    /// and on, so I'll stop now."))
207719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
207819625d8cSopenharmony_ci    ///         "prog", "--help"
207919625d8cSopenharmony_ci    ///     ]);
208019625d8cSopenharmony_ci    /// ```
208119625d8cSopenharmony_ci    ///
208219625d8cSopenharmony_ci    /// The above example displays
208319625d8cSopenharmony_ci    ///
208419625d8cSopenharmony_ci    /// ```text
208519625d8cSopenharmony_ci    /// prog
208619625d8cSopenharmony_ci    ///
208719625d8cSopenharmony_ci    /// Usage: prog [OPTIONS]
208819625d8cSopenharmony_ci    ///
208919625d8cSopenharmony_ci    /// Options:
209019625d8cSopenharmony_ci    ///         --config
209119625d8cSopenharmony_ci    ///             The config file used by the myprog must be in JSON format
209219625d8cSopenharmony_ci    ///             with only valid keys and may not contain other nonsense
209319625d8cSopenharmony_ci    ///             that cannot be read by this program. Obviously I'm going on
209419625d8cSopenharmony_ci    ///             and on, so I'll stop now.
209519625d8cSopenharmony_ci    ///
209619625d8cSopenharmony_ci    ///     -h, --help
209719625d8cSopenharmony_ci    ///             Print help information
209819625d8cSopenharmony_ci    ///
209919625d8cSopenharmony_ci    ///     -V, --version
210019625d8cSopenharmony_ci    ///             Print version information
210119625d8cSopenharmony_ci    /// ```
210219625d8cSopenharmony_ci    /// [`Arg::help`]: Arg::help()
210319625d8cSopenharmony_ci    #[inline]
210419625d8cSopenharmony_ci    #[must_use]
210519625d8cSopenharmony_ci    pub fn long_help(mut self, h: impl IntoResettable<StyledStr>) -> Self {
210619625d8cSopenharmony_ci        self.long_help = h.into_resettable().into_option();
210719625d8cSopenharmony_ci        self
210819625d8cSopenharmony_ci    }
210919625d8cSopenharmony_ci
211019625d8cSopenharmony_ci    /// Allows custom ordering of args within the help message.
211119625d8cSopenharmony_ci    ///
211219625d8cSopenharmony_ci    /// Args with a lower value will be displayed first in the help message. This is helpful when
211319625d8cSopenharmony_ci    /// one would like to emphasise frequently used args, or prioritize those towards the top of
211419625d8cSopenharmony_ci    /// the list. Args with duplicate display orders will be displayed in the order they are
211519625d8cSopenharmony_ci    /// defined.
211619625d8cSopenharmony_ci    ///
211719625d8cSopenharmony_ci    /// **NOTE:** The default is 999 for all arguments.
211819625d8cSopenharmony_ci    ///
211919625d8cSopenharmony_ci    /// **NOTE:** This setting is ignored for [positional arguments] which are always displayed in
212019625d8cSopenharmony_ci    /// [index] order.
212119625d8cSopenharmony_ci    ///
212219625d8cSopenharmony_ci    /// # Examples
212319625d8cSopenharmony_ci    ///
212419625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
212519625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
212619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
212719625d8cSopenharmony_ci    /// let m = Command::new("prog")
212819625d8cSopenharmony_ci    ///     .arg(Arg::new("a") // Typically args are grouped alphabetically by name.
212919625d8cSopenharmony_ci    ///                              // Args without a display_order have a value of 999 and are
213019625d8cSopenharmony_ci    ///                              // displayed alphabetically with all other 999 valued args.
213119625d8cSopenharmony_ci    ///         .long("long-option")
213219625d8cSopenharmony_ci    ///         .short('o')
213319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
213419625d8cSopenharmony_ci    ///         .help("Some help and text"))
213519625d8cSopenharmony_ci    ///     .arg(Arg::new("b")
213619625d8cSopenharmony_ci    ///         .long("other-option")
213719625d8cSopenharmony_ci    ///         .short('O')
213819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
213919625d8cSopenharmony_ci    ///         .display_order(1)   // In order to force this arg to appear *first*
214019625d8cSopenharmony_ci    ///                             // all we have to do is give it a value lower than 999.
214119625d8cSopenharmony_ci    ///                             // Any other args with a value of 1 will be displayed
214219625d8cSopenharmony_ci    ///                             // alphabetically with this one...then 2 values, then 3, etc.
214319625d8cSopenharmony_ci    ///         .help("I should be first!"))
214419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
214519625d8cSopenharmony_ci    ///         "prog", "--help"
214619625d8cSopenharmony_ci    ///     ]);
214719625d8cSopenharmony_ci    /// ```
214819625d8cSopenharmony_ci    ///
214919625d8cSopenharmony_ci    /// The above example displays the following help message
215019625d8cSopenharmony_ci    ///
215119625d8cSopenharmony_ci    /// ```text
215219625d8cSopenharmony_ci    /// cust-ord
215319625d8cSopenharmony_ci    ///
215419625d8cSopenharmony_ci    /// Usage: cust-ord [OPTIONS]
215519625d8cSopenharmony_ci    ///
215619625d8cSopenharmony_ci    /// Options:
215719625d8cSopenharmony_ci    ///     -h, --help                Print help information
215819625d8cSopenharmony_ci    ///     -V, --version             Print version information
215919625d8cSopenharmony_ci    ///     -O, --other-option <b>    I should be first!
216019625d8cSopenharmony_ci    ///     -o, --long-option <a>     Some help and text
216119625d8cSopenharmony_ci    /// ```
216219625d8cSopenharmony_ci    /// [positional arguments]: Arg::index()
216319625d8cSopenharmony_ci    /// [index]: Arg::index()
216419625d8cSopenharmony_ci    #[inline]
216519625d8cSopenharmony_ci    #[must_use]
216619625d8cSopenharmony_ci    pub fn display_order(mut self, ord: impl IntoResettable<usize>) -> Self {
216719625d8cSopenharmony_ci        self.disp_ord = ord.into_resettable().into_option();
216819625d8cSopenharmony_ci        self
216919625d8cSopenharmony_ci    }
217019625d8cSopenharmony_ci
217119625d8cSopenharmony_ci    /// Override the [current] help section.
217219625d8cSopenharmony_ci    ///
217319625d8cSopenharmony_ci    /// [current]: crate::Command::next_help_heading
217419625d8cSopenharmony_ci    #[inline]
217519625d8cSopenharmony_ci    #[must_use]
217619625d8cSopenharmony_ci    pub fn help_heading(mut self, heading: impl IntoResettable<Str>) -> Self {
217719625d8cSopenharmony_ci        self.help_heading = Some(heading.into_resettable().into_option());
217819625d8cSopenharmony_ci        self
217919625d8cSopenharmony_ci    }
218019625d8cSopenharmony_ci
218119625d8cSopenharmony_ci    /// Render the [help][Arg::help] on the line after the argument.
218219625d8cSopenharmony_ci    ///
218319625d8cSopenharmony_ci    /// This can be helpful for arguments with very long or complex help messages.
218419625d8cSopenharmony_ci    /// This can also be helpful for arguments with very long flag names, or many/long value names.
218519625d8cSopenharmony_ci    ///
218619625d8cSopenharmony_ci    /// **NOTE:** To apply this setting to all arguments and subcommands, consider using
218719625d8cSopenharmony_ci    /// [`crate::Command::next_line_help`]
218819625d8cSopenharmony_ci    ///
218919625d8cSopenharmony_ci    /// # Examples
219019625d8cSopenharmony_ci    ///
219119625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
219219625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
219319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
219419625d8cSopenharmony_ci    /// let m = Command::new("prog")
219519625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
219619625d8cSopenharmony_ci    ///         .long("long-option-flag")
219719625d8cSopenharmony_ci    ///         .short('o')
219819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
219919625d8cSopenharmony_ci    ///         .next_line_help(true)
220019625d8cSopenharmony_ci    ///         .value_names(["value1", "value2"])
220119625d8cSopenharmony_ci    ///         .help("Some really long help and complex\n\
220219625d8cSopenharmony_ci    ///                help that makes more sense to be\n\
220319625d8cSopenharmony_ci    ///                on a line after the option"))
220419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
220519625d8cSopenharmony_ci    ///         "prog", "--help"
220619625d8cSopenharmony_ci    ///     ]);
220719625d8cSopenharmony_ci    /// ```
220819625d8cSopenharmony_ci    ///
220919625d8cSopenharmony_ci    /// The above example displays the following help message
221019625d8cSopenharmony_ci    ///
221119625d8cSopenharmony_ci    /// ```text
221219625d8cSopenharmony_ci    /// nlh
221319625d8cSopenharmony_ci    ///
221419625d8cSopenharmony_ci    /// Usage: nlh [OPTIONS]
221519625d8cSopenharmony_ci    ///
221619625d8cSopenharmony_ci    /// Options:
221719625d8cSopenharmony_ci    ///     -h, --help       Print help information
221819625d8cSopenharmony_ci    ///     -V, --version    Print version information
221919625d8cSopenharmony_ci    ///     -o, --long-option-flag <value1> <value2>
222019625d8cSopenharmony_ci    ///         Some really long help and complex
222119625d8cSopenharmony_ci    ///         help that makes more sense to be
222219625d8cSopenharmony_ci    ///         on a line after the option
222319625d8cSopenharmony_ci    /// ```
222419625d8cSopenharmony_ci    #[inline]
222519625d8cSopenharmony_ci    #[must_use]
222619625d8cSopenharmony_ci    pub fn next_line_help(self, yes: bool) -> Self {
222719625d8cSopenharmony_ci        if yes {
222819625d8cSopenharmony_ci            self.setting(ArgSettings::NextLineHelp)
222919625d8cSopenharmony_ci        } else {
223019625d8cSopenharmony_ci            self.unset_setting(ArgSettings::NextLineHelp)
223119625d8cSopenharmony_ci        }
223219625d8cSopenharmony_ci    }
223319625d8cSopenharmony_ci
223419625d8cSopenharmony_ci    /// Do not display the argument in help message.
223519625d8cSopenharmony_ci    ///
223619625d8cSopenharmony_ci    /// **NOTE:** This does **not** hide the argument from usage strings on error
223719625d8cSopenharmony_ci    ///
223819625d8cSopenharmony_ci    /// # Examples
223919625d8cSopenharmony_ci    ///
224019625d8cSopenharmony_ci    /// Setting `Hidden` will hide the argument when displaying help text
224119625d8cSopenharmony_ci    ///
224219625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
224319625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
224419625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
224519625d8cSopenharmony_ci    /// let m = Command::new("prog")
224619625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
224719625d8cSopenharmony_ci    ///         .long("config")
224819625d8cSopenharmony_ci    ///         .hide(true)
224919625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
225019625d8cSopenharmony_ci    ///     .get_matches_from(vec![
225119625d8cSopenharmony_ci    ///         "prog", "--help"
225219625d8cSopenharmony_ci    ///     ]);
225319625d8cSopenharmony_ci    /// ```
225419625d8cSopenharmony_ci    ///
225519625d8cSopenharmony_ci    /// The above example displays
225619625d8cSopenharmony_ci    ///
225719625d8cSopenharmony_ci    /// ```text
225819625d8cSopenharmony_ci    /// helptest
225919625d8cSopenharmony_ci    ///
226019625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
226119625d8cSopenharmony_ci    ///
226219625d8cSopenharmony_ci    /// Options:
226319625d8cSopenharmony_ci    /// -h, --help       Print help information
226419625d8cSopenharmony_ci    /// -V, --version    Print version information
226519625d8cSopenharmony_ci    /// ```
226619625d8cSopenharmony_ci    #[inline]
226719625d8cSopenharmony_ci    #[must_use]
226819625d8cSopenharmony_ci    pub fn hide(self, yes: bool) -> Self {
226919625d8cSopenharmony_ci        if yes {
227019625d8cSopenharmony_ci            self.setting(ArgSettings::Hidden)
227119625d8cSopenharmony_ci        } else {
227219625d8cSopenharmony_ci            self.unset_setting(ArgSettings::Hidden)
227319625d8cSopenharmony_ci        }
227419625d8cSopenharmony_ci    }
227519625d8cSopenharmony_ci
227619625d8cSopenharmony_ci    /// Do not display the [possible values][crate::builder::ValueParser::possible_values] in the help message.
227719625d8cSopenharmony_ci    ///
227819625d8cSopenharmony_ci    /// This is useful for args with many values, or ones which are explained elsewhere in the
227919625d8cSopenharmony_ci    /// help text.
228019625d8cSopenharmony_ci    ///
228119625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
228219625d8cSopenharmony_ci    ///
228319625d8cSopenharmony_ci    /// To set this for all arguments, see
228419625d8cSopenharmony_ci    /// [`Command::hide_possible_values`][crate::Command::hide_possible_values].
228519625d8cSopenharmony_ci    ///
228619625d8cSopenharmony_ci    /// # Examples
228719625d8cSopenharmony_ci    ///
228819625d8cSopenharmony_ci    /// ```rust
228919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
229019625d8cSopenharmony_ci    /// let m = Command::new("prog")
229119625d8cSopenharmony_ci    ///     .arg(Arg::new("mode")
229219625d8cSopenharmony_ci    ///         .long("mode")
229319625d8cSopenharmony_ci    ///         .value_parser(["fast", "slow"])
229419625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
229519625d8cSopenharmony_ci    ///         .hide_possible_values(true));
229619625d8cSopenharmony_ci    /// ```
229719625d8cSopenharmony_ci    /// If we were to run the above program with `--help` the `[values: fast, slow]` portion of
229819625d8cSopenharmony_ci    /// the help text would be omitted.
229919625d8cSopenharmony_ci    #[inline]
230019625d8cSopenharmony_ci    #[must_use]
230119625d8cSopenharmony_ci    pub fn hide_possible_values(self, yes: bool) -> Self {
230219625d8cSopenharmony_ci        if yes {
230319625d8cSopenharmony_ci            self.setting(ArgSettings::HidePossibleValues)
230419625d8cSopenharmony_ci        } else {
230519625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HidePossibleValues)
230619625d8cSopenharmony_ci        }
230719625d8cSopenharmony_ci    }
230819625d8cSopenharmony_ci
230919625d8cSopenharmony_ci    /// Do not display the default value of the argument in the help message.
231019625d8cSopenharmony_ci    ///
231119625d8cSopenharmony_ci    /// This is useful when default behavior of an arg is explained elsewhere in the help text.
231219625d8cSopenharmony_ci    ///
231319625d8cSopenharmony_ci    /// **NOTE:** Setting this requires [taking values][Arg::num_args]
231419625d8cSopenharmony_ci    ///
231519625d8cSopenharmony_ci    /// # Examples
231619625d8cSopenharmony_ci    ///
231719625d8cSopenharmony_ci    /// ```rust
231819625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
231919625d8cSopenharmony_ci    /// let m = Command::new("connect")
232019625d8cSopenharmony_ci    ///     .arg(Arg::new("host")
232119625d8cSopenharmony_ci    ///         .long("host")
232219625d8cSopenharmony_ci    ///         .default_value("localhost")
232319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
232419625d8cSopenharmony_ci    ///         .hide_default_value(true));
232519625d8cSopenharmony_ci    ///
232619625d8cSopenharmony_ci    /// ```
232719625d8cSopenharmony_ci    ///
232819625d8cSopenharmony_ci    /// If we were to run the above program with `--help` the `[default: localhost]` portion of
232919625d8cSopenharmony_ci    /// the help text would be omitted.
233019625d8cSopenharmony_ci    #[inline]
233119625d8cSopenharmony_ci    #[must_use]
233219625d8cSopenharmony_ci    pub fn hide_default_value(self, yes: bool) -> Self {
233319625d8cSopenharmony_ci        if yes {
233419625d8cSopenharmony_ci            self.setting(ArgSettings::HideDefaultValue)
233519625d8cSopenharmony_ci        } else {
233619625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HideDefaultValue)
233719625d8cSopenharmony_ci        }
233819625d8cSopenharmony_ci    }
233919625d8cSopenharmony_ci
234019625d8cSopenharmony_ci    /// Do not display in help the environment variable name.
234119625d8cSopenharmony_ci    ///
234219625d8cSopenharmony_ci    /// This is useful when the variable option is explained elsewhere in the help text.
234319625d8cSopenharmony_ci    ///
234419625d8cSopenharmony_ci    /// # Examples
234519625d8cSopenharmony_ci    ///
234619625d8cSopenharmony_ci    /// ```rust
234719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
234819625d8cSopenharmony_ci    /// let m = Command::new("prog")
234919625d8cSopenharmony_ci    ///     .arg(Arg::new("mode")
235019625d8cSopenharmony_ci    ///         .long("mode")
235119625d8cSopenharmony_ci    ///         .env("MODE")
235219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
235319625d8cSopenharmony_ci    ///         .hide_env(true));
235419625d8cSopenharmony_ci    /// ```
235519625d8cSopenharmony_ci    ///
235619625d8cSopenharmony_ci    /// If we were to run the above program with `--help` the `[env: MODE]` portion of the help
235719625d8cSopenharmony_ci    /// text would be omitted.
235819625d8cSopenharmony_ci    #[cfg(feature = "env")]
235919625d8cSopenharmony_ci    #[inline]
236019625d8cSopenharmony_ci    #[must_use]
236119625d8cSopenharmony_ci    pub fn hide_env(self, yes: bool) -> Self {
236219625d8cSopenharmony_ci        if yes {
236319625d8cSopenharmony_ci            self.setting(ArgSettings::HideEnv)
236419625d8cSopenharmony_ci        } else {
236519625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HideEnv)
236619625d8cSopenharmony_ci        }
236719625d8cSopenharmony_ci    }
236819625d8cSopenharmony_ci
236919625d8cSopenharmony_ci    /// Do not display in help any values inside the associated ENV variables for the argument.
237019625d8cSopenharmony_ci    ///
237119625d8cSopenharmony_ci    /// This is useful when ENV vars contain sensitive values.
237219625d8cSopenharmony_ci    ///
237319625d8cSopenharmony_ci    /// # Examples
237419625d8cSopenharmony_ci    ///
237519625d8cSopenharmony_ci    /// ```rust
237619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
237719625d8cSopenharmony_ci    /// let m = Command::new("connect")
237819625d8cSopenharmony_ci    ///     .arg(Arg::new("host")
237919625d8cSopenharmony_ci    ///         .long("host")
238019625d8cSopenharmony_ci    ///         .env("CONNECT")
238119625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
238219625d8cSopenharmony_ci    ///         .hide_env_values(true));
238319625d8cSopenharmony_ci    ///
238419625d8cSopenharmony_ci    /// ```
238519625d8cSopenharmony_ci    ///
238619625d8cSopenharmony_ci    /// If we were to run the above program with `$ CONNECT=super_secret connect --help` the
238719625d8cSopenharmony_ci    /// `[default: CONNECT=super_secret]` portion of the help text would be omitted.
238819625d8cSopenharmony_ci    #[cfg(feature = "env")]
238919625d8cSopenharmony_ci    #[inline]
239019625d8cSopenharmony_ci    #[must_use]
239119625d8cSopenharmony_ci    pub fn hide_env_values(self, yes: bool) -> Self {
239219625d8cSopenharmony_ci        if yes {
239319625d8cSopenharmony_ci            self.setting(ArgSettings::HideEnvValues)
239419625d8cSopenharmony_ci        } else {
239519625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HideEnvValues)
239619625d8cSopenharmony_ci        }
239719625d8cSopenharmony_ci    }
239819625d8cSopenharmony_ci
239919625d8cSopenharmony_ci    /// Hides an argument from short help (`-h`).
240019625d8cSopenharmony_ci    ///
240119625d8cSopenharmony_ci    /// **NOTE:** This does **not** hide the argument from usage strings on error
240219625d8cSopenharmony_ci    ///
240319625d8cSopenharmony_ci    /// **NOTE:** Setting this option will cause next-line-help output style to be used
240419625d8cSopenharmony_ci    /// when long help (`--help`) is called.
240519625d8cSopenharmony_ci    ///
240619625d8cSopenharmony_ci    /// # Examples
240719625d8cSopenharmony_ci    ///
240819625d8cSopenharmony_ci    /// ```rust
240919625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
241019625d8cSopenharmony_ci    /// Arg::new("debug")
241119625d8cSopenharmony_ci    ///     .hide_short_help(true);
241219625d8cSopenharmony_ci    /// ```
241319625d8cSopenharmony_ci    ///
241419625d8cSopenharmony_ci    /// Setting `hide_short_help(true)` will hide the argument when displaying short help text
241519625d8cSopenharmony_ci    ///
241619625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
241719625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
241819625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
241919625d8cSopenharmony_ci    /// let m = Command::new("prog")
242019625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
242119625d8cSopenharmony_ci    ///         .long("config")
242219625d8cSopenharmony_ci    ///         .hide_short_help(true)
242319625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
242419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
242519625d8cSopenharmony_ci    ///         "prog", "-h"
242619625d8cSopenharmony_ci    ///     ]);
242719625d8cSopenharmony_ci    /// ```
242819625d8cSopenharmony_ci    ///
242919625d8cSopenharmony_ci    /// The above example displays
243019625d8cSopenharmony_ci    ///
243119625d8cSopenharmony_ci    /// ```text
243219625d8cSopenharmony_ci    /// helptest
243319625d8cSopenharmony_ci    ///
243419625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
243519625d8cSopenharmony_ci    ///
243619625d8cSopenharmony_ci    /// Options:
243719625d8cSopenharmony_ci    /// -h, --help       Print help information
243819625d8cSopenharmony_ci    /// -V, --version    Print version information
243919625d8cSopenharmony_ci    /// ```
244019625d8cSopenharmony_ci    ///
244119625d8cSopenharmony_ci    /// However, when --help is called
244219625d8cSopenharmony_ci    ///
244319625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
244419625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
244519625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
244619625d8cSopenharmony_ci    /// let m = Command::new("prog")
244719625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
244819625d8cSopenharmony_ci    ///         .long("config")
244919625d8cSopenharmony_ci    ///         .hide_short_help(true)
245019625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
245119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
245219625d8cSopenharmony_ci    ///         "prog", "--help"
245319625d8cSopenharmony_ci    ///     ]);
245419625d8cSopenharmony_ci    /// ```
245519625d8cSopenharmony_ci    ///
245619625d8cSopenharmony_ci    /// Then the following would be displayed
245719625d8cSopenharmony_ci    ///
245819625d8cSopenharmony_ci    /// ```text
245919625d8cSopenharmony_ci    /// helptest
246019625d8cSopenharmony_ci    ///
246119625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
246219625d8cSopenharmony_ci    ///
246319625d8cSopenharmony_ci    /// Options:
246419625d8cSopenharmony_ci    ///     --config     Some help text describing the --config arg
246519625d8cSopenharmony_ci    /// -h, --help       Print help information
246619625d8cSopenharmony_ci    /// -V, --version    Print version information
246719625d8cSopenharmony_ci    /// ```
246819625d8cSopenharmony_ci    #[inline]
246919625d8cSopenharmony_ci    #[must_use]
247019625d8cSopenharmony_ci    pub fn hide_short_help(self, yes: bool) -> Self {
247119625d8cSopenharmony_ci        if yes {
247219625d8cSopenharmony_ci            self.setting(ArgSettings::HiddenShortHelp)
247319625d8cSopenharmony_ci        } else {
247419625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HiddenShortHelp)
247519625d8cSopenharmony_ci        }
247619625d8cSopenharmony_ci    }
247719625d8cSopenharmony_ci
247819625d8cSopenharmony_ci    /// Hides an argument from long help (`--help`).
247919625d8cSopenharmony_ci    ///
248019625d8cSopenharmony_ci    /// **NOTE:** This does **not** hide the argument from usage strings on error
248119625d8cSopenharmony_ci    ///
248219625d8cSopenharmony_ci    /// **NOTE:** Setting this option will cause next-line-help output style to be used
248319625d8cSopenharmony_ci    /// when long help (`--help`) is called.
248419625d8cSopenharmony_ci    ///
248519625d8cSopenharmony_ci    /// # Examples
248619625d8cSopenharmony_ci    ///
248719625d8cSopenharmony_ci    /// Setting `hide_long_help(true)` will hide the argument when displaying long help text
248819625d8cSopenharmony_ci    ///
248919625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
249019625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
249119625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
249219625d8cSopenharmony_ci    /// let m = Command::new("prog")
249319625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
249419625d8cSopenharmony_ci    ///         .long("config")
249519625d8cSopenharmony_ci    ///         .hide_long_help(true)
249619625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
249719625d8cSopenharmony_ci    ///     .get_matches_from(vec![
249819625d8cSopenharmony_ci    ///         "prog", "--help"
249919625d8cSopenharmony_ci    ///     ]);
250019625d8cSopenharmony_ci    /// ```
250119625d8cSopenharmony_ci    ///
250219625d8cSopenharmony_ci    /// The above example displays
250319625d8cSopenharmony_ci    ///
250419625d8cSopenharmony_ci    /// ```text
250519625d8cSopenharmony_ci    /// helptest
250619625d8cSopenharmony_ci    ///
250719625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
250819625d8cSopenharmony_ci    ///
250919625d8cSopenharmony_ci    /// Options:
251019625d8cSopenharmony_ci    /// -h, --help       Print help information
251119625d8cSopenharmony_ci    /// -V, --version    Print version information
251219625d8cSopenharmony_ci    /// ```
251319625d8cSopenharmony_ci    ///
251419625d8cSopenharmony_ci    /// However, when -h is called
251519625d8cSopenharmony_ci    ///
251619625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
251719625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
251819625d8cSopenharmony_ci    /// # use clap::{Command, Arg};
251919625d8cSopenharmony_ci    /// let m = Command::new("prog")
252019625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
252119625d8cSopenharmony_ci    ///         .long("config")
252219625d8cSopenharmony_ci    ///         .hide_long_help(true)
252319625d8cSopenharmony_ci    ///         .help("Some help text describing the --config arg"))
252419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
252519625d8cSopenharmony_ci    ///         "prog", "-h"
252619625d8cSopenharmony_ci    ///     ]);
252719625d8cSopenharmony_ci    /// ```
252819625d8cSopenharmony_ci    ///
252919625d8cSopenharmony_ci    /// Then the following would be displayed
253019625d8cSopenharmony_ci    ///
253119625d8cSopenharmony_ci    /// ```text
253219625d8cSopenharmony_ci    /// helptest
253319625d8cSopenharmony_ci    ///
253419625d8cSopenharmony_ci    /// Usage: helptest [OPTIONS]
253519625d8cSopenharmony_ci    ///
253619625d8cSopenharmony_ci    /// OPTIONS:
253719625d8cSopenharmony_ci    ///     --config     Some help text describing the --config arg
253819625d8cSopenharmony_ci    /// -h, --help       Print help information
253919625d8cSopenharmony_ci    /// -V, --version    Print version information
254019625d8cSopenharmony_ci    /// ```
254119625d8cSopenharmony_ci    #[inline]
254219625d8cSopenharmony_ci    #[must_use]
254319625d8cSopenharmony_ci    pub fn hide_long_help(self, yes: bool) -> Self {
254419625d8cSopenharmony_ci        if yes {
254519625d8cSopenharmony_ci            self.setting(ArgSettings::HiddenLongHelp)
254619625d8cSopenharmony_ci        } else {
254719625d8cSopenharmony_ci            self.unset_setting(ArgSettings::HiddenLongHelp)
254819625d8cSopenharmony_ci        }
254919625d8cSopenharmony_ci    }
255019625d8cSopenharmony_ci}
255119625d8cSopenharmony_ci
255219625d8cSopenharmony_ci/// # Advanced Argument Relations
255319625d8cSopenharmony_ciimpl Arg {
255419625d8cSopenharmony_ci    /// The name of the [`ArgGroup`] the argument belongs to.
255519625d8cSopenharmony_ci    ///
255619625d8cSopenharmony_ci    /// # Examples
255719625d8cSopenharmony_ci    ///
255819625d8cSopenharmony_ci    /// ```rust
255919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
256019625d8cSopenharmony_ci    /// Arg::new("debug")
256119625d8cSopenharmony_ci    ///     .long("debug")
256219625d8cSopenharmony_ci    ///     .action(ArgAction::SetTrue)
256319625d8cSopenharmony_ci    ///     .group("mode")
256419625d8cSopenharmony_ci    /// # ;
256519625d8cSopenharmony_ci    /// ```
256619625d8cSopenharmony_ci    ///
256719625d8cSopenharmony_ci    /// Multiple arguments can be a member of a single group and then the group checked as if it
256819625d8cSopenharmony_ci    /// was one of said arguments.
256919625d8cSopenharmony_ci    ///
257019625d8cSopenharmony_ci    /// ```rust
257119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
257219625d8cSopenharmony_ci    /// let m = Command::new("prog")
257319625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
257419625d8cSopenharmony_ci    ///         .long("debug")
257519625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
257619625d8cSopenharmony_ci    ///         .group("mode"))
257719625d8cSopenharmony_ci    ///     .arg(Arg::new("verbose")
257819625d8cSopenharmony_ci    ///         .long("verbose")
257919625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
258019625d8cSopenharmony_ci    ///         .group("mode"))
258119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
258219625d8cSopenharmony_ci    ///         "prog", "--debug"
258319625d8cSopenharmony_ci    ///     ]);
258419625d8cSopenharmony_ci    /// assert!(m.contains_id("mode"));
258519625d8cSopenharmony_ci    /// ```
258619625d8cSopenharmony_ci    ///
258719625d8cSopenharmony_ci    /// [`ArgGroup`]: crate::ArgGroup
258819625d8cSopenharmony_ci    #[must_use]
258919625d8cSopenharmony_ci    pub fn group(mut self, group_id: impl IntoResettable<Id>) -> Self {
259019625d8cSopenharmony_ci        if let Some(group_id) = group_id.into_resettable().into_option() {
259119625d8cSopenharmony_ci            self.groups.push(group_id);
259219625d8cSopenharmony_ci        } else {
259319625d8cSopenharmony_ci            self.groups.clear();
259419625d8cSopenharmony_ci        }
259519625d8cSopenharmony_ci        self
259619625d8cSopenharmony_ci    }
259719625d8cSopenharmony_ci
259819625d8cSopenharmony_ci    /// The names of [`ArgGroup`]'s the argument belongs to.
259919625d8cSopenharmony_ci    ///
260019625d8cSopenharmony_ci    /// # Examples
260119625d8cSopenharmony_ci    ///
260219625d8cSopenharmony_ci    /// ```rust
260319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
260419625d8cSopenharmony_ci    /// Arg::new("debug")
260519625d8cSopenharmony_ci    ///     .long("debug")
260619625d8cSopenharmony_ci    ///     .action(ArgAction::SetTrue)
260719625d8cSopenharmony_ci    ///     .groups(["mode", "verbosity"])
260819625d8cSopenharmony_ci    /// # ;
260919625d8cSopenharmony_ci    /// ```
261019625d8cSopenharmony_ci    ///
261119625d8cSopenharmony_ci    /// Arguments can be members of multiple groups and then the group checked as if it
261219625d8cSopenharmony_ci    /// was one of said arguments.
261319625d8cSopenharmony_ci    ///
261419625d8cSopenharmony_ci    /// ```rust
261519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
261619625d8cSopenharmony_ci    /// let m = Command::new("prog")
261719625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
261819625d8cSopenharmony_ci    ///         .long("debug")
261919625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
262019625d8cSopenharmony_ci    ///         .groups(["mode", "verbosity"]))
262119625d8cSopenharmony_ci    ///     .arg(Arg::new("verbose")
262219625d8cSopenharmony_ci    ///         .long("verbose")
262319625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
262419625d8cSopenharmony_ci    ///         .groups(["mode", "verbosity"]))
262519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
262619625d8cSopenharmony_ci    ///         "prog", "--debug"
262719625d8cSopenharmony_ci    ///     ]);
262819625d8cSopenharmony_ci    /// assert!(m.contains_id("mode"));
262919625d8cSopenharmony_ci    /// assert!(m.contains_id("verbosity"));
263019625d8cSopenharmony_ci    /// ```
263119625d8cSopenharmony_ci    ///
263219625d8cSopenharmony_ci    /// [`ArgGroup`]: crate::ArgGroup
263319625d8cSopenharmony_ci    #[must_use]
263419625d8cSopenharmony_ci    pub fn groups(mut self, group_ids: impl IntoIterator<Item = impl Into<Id>>) -> Self {
263519625d8cSopenharmony_ci        self.groups.extend(group_ids.into_iter().map(Into::into));
263619625d8cSopenharmony_ci        self
263719625d8cSopenharmony_ci    }
263819625d8cSopenharmony_ci
263919625d8cSopenharmony_ci    /// Specifies the value of the argument if `arg` has been used at runtime.
264019625d8cSopenharmony_ci    ///
264119625d8cSopenharmony_ci    /// If `default` is set to `None`, `default_value` will be removed.
264219625d8cSopenharmony_ci    ///
264319625d8cSopenharmony_ci    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value`] but slightly
264419625d8cSopenharmony_ci    /// different. `Arg::default_value` *only* takes effect when the user has not provided this arg
264519625d8cSopenharmony_ci    /// at runtime. This setting however only takes effect when the user has not provided a value at
264619625d8cSopenharmony_ci    /// runtime **and** these other conditions are met as well. If you have set `Arg::default_value`
264719625d8cSopenharmony_ci    /// and `Arg::default_value_if`, and the user **did not** provide this arg at runtime, nor were
264819625d8cSopenharmony_ci    /// the conditions met for `Arg::default_value_if`, the `Arg::default_value` will be applied.
264919625d8cSopenharmony_ci    ///
265019625d8cSopenharmony_ci    /// **NOTE:** This implicitly sets [`Arg::action(ArgAction::Set)`].
265119625d8cSopenharmony_ci    ///
265219625d8cSopenharmony_ci    /// # Examples
265319625d8cSopenharmony_ci    ///
265419625d8cSopenharmony_ci    /// First we use the default value only if another arg is present at runtime.
265519625d8cSopenharmony_ci    ///
265619625d8cSopenharmony_ci    /// ```rust
265719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
265819625d8cSopenharmony_ci    /// # use clap::builder::{ArgPredicate};
265919625d8cSopenharmony_ci    /// let m = Command::new("prog")
266019625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
266119625d8cSopenharmony_ci    ///         .long("flag")
266219625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
266319625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
266419625d8cSopenharmony_ci    ///         .long("other")
266519625d8cSopenharmony_ci    ///         .default_value_if("flag", ArgPredicate::IsPresent, Some("default")))
266619625d8cSopenharmony_ci    ///     .get_matches_from(vec![
266719625d8cSopenharmony_ci    ///         "prog", "--flag"
266819625d8cSopenharmony_ci    ///     ]);
266919625d8cSopenharmony_ci    ///
267019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other").unwrap(), "default");
267119625d8cSopenharmony_ci    /// ```
267219625d8cSopenharmony_ci    ///
267319625d8cSopenharmony_ci    /// Next we run the same test, but without providing `--flag`.
267419625d8cSopenharmony_ci    ///
267519625d8cSopenharmony_ci    /// ```rust
267619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
267719625d8cSopenharmony_ci    /// let m = Command::new("prog")
267819625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
267919625d8cSopenharmony_ci    ///         .long("flag")
268019625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
268119625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
268219625d8cSopenharmony_ci    ///         .long("other")
268319625d8cSopenharmony_ci    ///         .default_value_if("flag", "true", Some("default")))
268419625d8cSopenharmony_ci    ///     .get_matches_from(vec![
268519625d8cSopenharmony_ci    ///         "prog"
268619625d8cSopenharmony_ci    ///     ]);
268719625d8cSopenharmony_ci    ///
268819625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other"), None);
268919625d8cSopenharmony_ci    /// ```
269019625d8cSopenharmony_ci    ///
269119625d8cSopenharmony_ci    /// Now lets only use the default value if `--opt` contains the value `special`.
269219625d8cSopenharmony_ci    ///
269319625d8cSopenharmony_ci    /// ```rust
269419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
269519625d8cSopenharmony_ci    /// let m = Command::new("prog")
269619625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
269719625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
269819625d8cSopenharmony_ci    ///         .long("opt"))
269919625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
270019625d8cSopenharmony_ci    ///         .long("other")
270119625d8cSopenharmony_ci    ///         .default_value_if("opt", "special", Some("default")))
270219625d8cSopenharmony_ci    ///     .get_matches_from(vec![
270319625d8cSopenharmony_ci    ///         "prog", "--opt", "special"
270419625d8cSopenharmony_ci    ///     ]);
270519625d8cSopenharmony_ci    ///
270619625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other").unwrap(), "default");
270719625d8cSopenharmony_ci    /// ```
270819625d8cSopenharmony_ci    ///
270919625d8cSopenharmony_ci    /// We can run the same test and provide any value *other than* `special` and we won't get a
271019625d8cSopenharmony_ci    /// default value.
271119625d8cSopenharmony_ci    ///
271219625d8cSopenharmony_ci    /// ```rust
271319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
271419625d8cSopenharmony_ci    /// let m = Command::new("prog")
271519625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
271619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
271719625d8cSopenharmony_ci    ///         .long("opt"))
271819625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
271919625d8cSopenharmony_ci    ///         .long("other")
272019625d8cSopenharmony_ci    ///         .default_value_if("opt", "special", Some("default")))
272119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
272219625d8cSopenharmony_ci    ///         "prog", "--opt", "hahaha"
272319625d8cSopenharmony_ci    ///     ]);
272419625d8cSopenharmony_ci    ///
272519625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other"), None);
272619625d8cSopenharmony_ci    /// ```
272719625d8cSopenharmony_ci    ///
272819625d8cSopenharmony_ci    /// If we want to unset the default value for an Arg based on the presence or
272919625d8cSopenharmony_ci    /// value of some other Arg.
273019625d8cSopenharmony_ci    ///
273119625d8cSopenharmony_ci    /// ```rust
273219625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
273319625d8cSopenharmony_ci    /// let m = Command::new("prog")
273419625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
273519625d8cSopenharmony_ci    ///         .long("flag")
273619625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
273719625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
273819625d8cSopenharmony_ci    ///         .long("other")
273919625d8cSopenharmony_ci    ///         .default_value("default")
274019625d8cSopenharmony_ci    ///         .default_value_if("flag", "true", None))
274119625d8cSopenharmony_ci    ///     .get_matches_from(vec![
274219625d8cSopenharmony_ci    ///         "prog", "--flag"
274319625d8cSopenharmony_ci    ///     ]);
274419625d8cSopenharmony_ci    ///
274519625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other"), None);
274619625d8cSopenharmony_ci    /// ```
274719625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
274819625d8cSopenharmony_ci    /// [`Arg::default_value`]: Arg::default_value()
274919625d8cSopenharmony_ci    #[must_use]
275019625d8cSopenharmony_ci    pub fn default_value_if(
275119625d8cSopenharmony_ci        mut self,
275219625d8cSopenharmony_ci        arg_id: impl Into<Id>,
275319625d8cSopenharmony_ci        predicate: impl Into<ArgPredicate>,
275419625d8cSopenharmony_ci        default: impl IntoResettable<OsStr>,
275519625d8cSopenharmony_ci    ) -> Self {
275619625d8cSopenharmony_ci        self.default_vals_ifs.push((
275719625d8cSopenharmony_ci            arg_id.into(),
275819625d8cSopenharmony_ci            predicate.into(),
275919625d8cSopenharmony_ci            default.into_resettable().into_option(),
276019625d8cSopenharmony_ci        ));
276119625d8cSopenharmony_ci        self
276219625d8cSopenharmony_ci    }
276319625d8cSopenharmony_ci
276419625d8cSopenharmony_ci    #[must_use]
276519625d8cSopenharmony_ci    #[doc(hidden)]
276619625d8cSopenharmony_ci    #[cfg_attr(
276719625d8cSopenharmony_ci        feature = "deprecated",
276819625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::default_value_if`")
276919625d8cSopenharmony_ci    )]
277019625d8cSopenharmony_ci    pub fn default_value_if_os(
277119625d8cSopenharmony_ci        self,
277219625d8cSopenharmony_ci        arg_id: impl Into<Id>,
277319625d8cSopenharmony_ci        predicate: impl Into<ArgPredicate>,
277419625d8cSopenharmony_ci        default: impl IntoResettable<OsStr>,
277519625d8cSopenharmony_ci    ) -> Self {
277619625d8cSopenharmony_ci        self.default_value_if(arg_id, predicate, default)
277719625d8cSopenharmony_ci    }
277819625d8cSopenharmony_ci
277919625d8cSopenharmony_ci    /// Specifies multiple values and conditions in the same manner as [`Arg::default_value_if`].
278019625d8cSopenharmony_ci    ///
278119625d8cSopenharmony_ci    /// The method takes a slice of tuples in the `(arg, predicate, default)` format.
278219625d8cSopenharmony_ci    ///
278319625d8cSopenharmony_ci    /// **NOTE**: The conditions are stored in order and evaluated in the same order. I.e. the first
278419625d8cSopenharmony_ci    /// if multiple conditions are true, the first one found will be applied and the ultimate value.
278519625d8cSopenharmony_ci    ///
278619625d8cSopenharmony_ci    /// # Examples
278719625d8cSopenharmony_ci    ///
278819625d8cSopenharmony_ci    /// First we use the default value only if another arg is present at runtime.
278919625d8cSopenharmony_ci    ///
279019625d8cSopenharmony_ci    /// ```rust
279119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
279219625d8cSopenharmony_ci    /// let m = Command::new("prog")
279319625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
279419625d8cSopenharmony_ci    ///         .long("flag")
279519625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
279619625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
279719625d8cSopenharmony_ci    ///         .long("opt")
279819625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
279919625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
280019625d8cSopenharmony_ci    ///         .long("other")
280119625d8cSopenharmony_ci    ///         .default_value_ifs([
280219625d8cSopenharmony_ci    ///             ("flag", "true", Some("default")),
280319625d8cSopenharmony_ci    ///             ("opt", "channal", Some("chan")),
280419625d8cSopenharmony_ci    ///         ]))
280519625d8cSopenharmony_ci    ///     .get_matches_from(vec![
280619625d8cSopenharmony_ci    ///         "prog", "--opt", "channal"
280719625d8cSopenharmony_ci    ///     ]);
280819625d8cSopenharmony_ci    ///
280919625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other").unwrap(), "chan");
281019625d8cSopenharmony_ci    /// ```
281119625d8cSopenharmony_ci    ///
281219625d8cSopenharmony_ci    /// Next we run the same test, but without providing `--flag`.
281319625d8cSopenharmony_ci    ///
281419625d8cSopenharmony_ci    /// ```rust
281519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
281619625d8cSopenharmony_ci    /// let m = Command::new("prog")
281719625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
281819625d8cSopenharmony_ci    ///         .long("flag")
281919625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
282019625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
282119625d8cSopenharmony_ci    ///         .long("other")
282219625d8cSopenharmony_ci    ///         .default_value_ifs([
282319625d8cSopenharmony_ci    ///             ("flag", "true", Some("default")),
282419625d8cSopenharmony_ci    ///             ("opt", "channal", Some("chan")),
282519625d8cSopenharmony_ci    ///         ]))
282619625d8cSopenharmony_ci    ///     .get_matches_from(vec![
282719625d8cSopenharmony_ci    ///         "prog"
282819625d8cSopenharmony_ci    ///     ]);
282919625d8cSopenharmony_ci    ///
283019625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other"), None);
283119625d8cSopenharmony_ci    /// ```
283219625d8cSopenharmony_ci    ///
283319625d8cSopenharmony_ci    /// We can also see that these values are applied in order, and if more than one condition is
283419625d8cSopenharmony_ci    /// true, only the first evaluated "wins"
283519625d8cSopenharmony_ci    ///
283619625d8cSopenharmony_ci    /// ```rust
283719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
283819625d8cSopenharmony_ci    /// # use clap::builder::ArgPredicate;
283919625d8cSopenharmony_ci    /// let m = Command::new("prog")
284019625d8cSopenharmony_ci    ///     .arg(Arg::new("flag")
284119625d8cSopenharmony_ci    ///         .long("flag")
284219625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
284319625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
284419625d8cSopenharmony_ci    ///         .long("opt")
284519625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
284619625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
284719625d8cSopenharmony_ci    ///         .long("other")
284819625d8cSopenharmony_ci    ///         .default_value_ifs([
284919625d8cSopenharmony_ci    ///             ("flag", ArgPredicate::IsPresent, Some("default")),
285019625d8cSopenharmony_ci    ///             ("opt", ArgPredicate::Equals("channal".into()), Some("chan")),
285119625d8cSopenharmony_ci    ///         ]))
285219625d8cSopenharmony_ci    ///     .get_matches_from(vec![
285319625d8cSopenharmony_ci    ///         "prog", "--opt", "channal", "--flag"
285419625d8cSopenharmony_ci    ///     ]);
285519625d8cSopenharmony_ci    ///
285619625d8cSopenharmony_ci    /// assert_eq!(m.get_one::<String>("other").unwrap(), "default");
285719625d8cSopenharmony_ci    /// ```
285819625d8cSopenharmony_ci    /// [`Arg::action(ArgAction::Set)`]: Arg::action()
285919625d8cSopenharmony_ci    /// [`Arg::default_value_if`]: Arg::default_value_if()
286019625d8cSopenharmony_ci    #[must_use]
286119625d8cSopenharmony_ci    pub fn default_value_ifs(
286219625d8cSopenharmony_ci        mut self,
286319625d8cSopenharmony_ci        ifs: impl IntoIterator<
286419625d8cSopenharmony_ci            Item = (
286519625d8cSopenharmony_ci                impl Into<Id>,
286619625d8cSopenharmony_ci                impl Into<ArgPredicate>,
286719625d8cSopenharmony_ci                impl IntoResettable<OsStr>,
286819625d8cSopenharmony_ci            ),
286919625d8cSopenharmony_ci        >,
287019625d8cSopenharmony_ci    ) -> Self {
287119625d8cSopenharmony_ci        for (arg, predicate, default) in ifs {
287219625d8cSopenharmony_ci            self = self.default_value_if(arg, predicate, default);
287319625d8cSopenharmony_ci        }
287419625d8cSopenharmony_ci        self
287519625d8cSopenharmony_ci    }
287619625d8cSopenharmony_ci
287719625d8cSopenharmony_ci    #[must_use]
287819625d8cSopenharmony_ci    #[doc(hidden)]
287919625d8cSopenharmony_ci    #[cfg_attr(
288019625d8cSopenharmony_ci        feature = "deprecated",
288119625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::default_value_ifs`")
288219625d8cSopenharmony_ci    )]
288319625d8cSopenharmony_ci    pub fn default_value_ifs_os(
288419625d8cSopenharmony_ci        self,
288519625d8cSopenharmony_ci        ifs: impl IntoIterator<
288619625d8cSopenharmony_ci            Item = (
288719625d8cSopenharmony_ci                impl Into<Id>,
288819625d8cSopenharmony_ci                impl Into<ArgPredicate>,
288919625d8cSopenharmony_ci                impl IntoResettable<OsStr>,
289019625d8cSopenharmony_ci            ),
289119625d8cSopenharmony_ci        >,
289219625d8cSopenharmony_ci    ) -> Self {
289319625d8cSopenharmony_ci        self.default_value_ifs(ifs)
289419625d8cSopenharmony_ci    }
289519625d8cSopenharmony_ci
289619625d8cSopenharmony_ci    /// Set this arg as [required] as long as the specified argument is not present at runtime.
289719625d8cSopenharmony_ci    ///
289819625d8cSopenharmony_ci    /// **Pro Tip:** Using `Arg::required_unless_present` implies [`Arg::required`] and is therefore not
289919625d8cSopenharmony_ci    /// mandatory to also set.
290019625d8cSopenharmony_ci    ///
290119625d8cSopenharmony_ci    /// # Examples
290219625d8cSopenharmony_ci    ///
290319625d8cSopenharmony_ci    /// ```rust
290419625d8cSopenharmony_ci    /// # use clap::Arg;
290519625d8cSopenharmony_ci    /// Arg::new("config")
290619625d8cSopenharmony_ci    ///     .required_unless_present("debug")
290719625d8cSopenharmony_ci    /// # ;
290819625d8cSopenharmony_ci    /// ```
290919625d8cSopenharmony_ci    ///
291019625d8cSopenharmony_ci    /// In the following example, the required argument is *not* provided,
291119625d8cSopenharmony_ci    /// but it's not an error because the `unless` arg has been supplied.
291219625d8cSopenharmony_ci    ///
291319625d8cSopenharmony_ci    /// ```rust
291419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
291519625d8cSopenharmony_ci    /// let res = Command::new("prog")
291619625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
291719625d8cSopenharmony_ci    ///         .required_unless_present("dbg")
291819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
291919625d8cSopenharmony_ci    ///         .long("config"))
292019625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
292119625d8cSopenharmony_ci    ///         .long("debug")
292219625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
292319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
292419625d8cSopenharmony_ci    ///         "prog", "--debug"
292519625d8cSopenharmony_ci    ///     ]);
292619625d8cSopenharmony_ci    ///
292719625d8cSopenharmony_ci    /// assert!(res.is_ok());
292819625d8cSopenharmony_ci    /// ```
292919625d8cSopenharmony_ci    ///
293019625d8cSopenharmony_ci    /// Setting `Arg::required_unless_present(name)` and *not* supplying `name` or this arg is an error.
293119625d8cSopenharmony_ci    ///
293219625d8cSopenharmony_ci    /// ```rust
293319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
293419625d8cSopenharmony_ci    /// let res = Command::new("prog")
293519625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
293619625d8cSopenharmony_ci    ///         .required_unless_present("dbg")
293719625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
293819625d8cSopenharmony_ci    ///         .long("config"))
293919625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
294019625d8cSopenharmony_ci    ///         .long("debug"))
294119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
294219625d8cSopenharmony_ci    ///         "prog"
294319625d8cSopenharmony_ci    ///     ]);
294419625d8cSopenharmony_ci    ///
294519625d8cSopenharmony_ci    /// assert!(res.is_err());
294619625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
294719625d8cSopenharmony_ci    /// ```
294819625d8cSopenharmony_ci    /// [required]: Arg::required()
294919625d8cSopenharmony_ci    #[must_use]
295019625d8cSopenharmony_ci    pub fn required_unless_present(mut self, arg_id: impl IntoResettable<Id>) -> Self {
295119625d8cSopenharmony_ci        if let Some(arg_id) = arg_id.into_resettable().into_option() {
295219625d8cSopenharmony_ci            self.r_unless.push(arg_id);
295319625d8cSopenharmony_ci        } else {
295419625d8cSopenharmony_ci            self.r_unless.clear();
295519625d8cSopenharmony_ci        }
295619625d8cSopenharmony_ci        self
295719625d8cSopenharmony_ci    }
295819625d8cSopenharmony_ci
295919625d8cSopenharmony_ci    /// Sets this arg as [required] unless *all* of the specified arguments are present at runtime.
296019625d8cSopenharmony_ci    ///
296119625d8cSopenharmony_ci    /// In other words, parsing will succeed only if user either
296219625d8cSopenharmony_ci    /// * supplies the `self` arg.
296319625d8cSopenharmony_ci    /// * supplies *all* of the `names` arguments.
296419625d8cSopenharmony_ci    ///
296519625d8cSopenharmony_ci    /// **NOTE:** If you wish for this argument to only be required unless *any of* these args are
296619625d8cSopenharmony_ci    /// present see [`Arg::required_unless_present_any`]
296719625d8cSopenharmony_ci    ///
296819625d8cSopenharmony_ci    /// # Examples
296919625d8cSopenharmony_ci    ///
297019625d8cSopenharmony_ci    /// ```rust
297119625d8cSopenharmony_ci    /// # use clap::Arg;
297219625d8cSopenharmony_ci    /// Arg::new("config")
297319625d8cSopenharmony_ci    ///     .required_unless_present_all(["cfg", "dbg"])
297419625d8cSopenharmony_ci    /// # ;
297519625d8cSopenharmony_ci    /// ```
297619625d8cSopenharmony_ci    ///
297719625d8cSopenharmony_ci    /// In the following example, the required argument is *not* provided, but it's not an error
297819625d8cSopenharmony_ci    /// because *all* of the `names` args have been supplied.
297919625d8cSopenharmony_ci    ///
298019625d8cSopenharmony_ci    /// ```rust
298119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
298219625d8cSopenharmony_ci    /// let res = Command::new("prog")
298319625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
298419625d8cSopenharmony_ci    ///         .required_unless_present_all(["dbg", "infile"])
298519625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
298619625d8cSopenharmony_ci    ///         .long("config"))
298719625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
298819625d8cSopenharmony_ci    ///         .long("debug")
298919625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
299019625d8cSopenharmony_ci    ///     .arg(Arg::new("infile")
299119625d8cSopenharmony_ci    ///         .short('i')
299219625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
299319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
299419625d8cSopenharmony_ci    ///         "prog", "--debug", "-i", "file"
299519625d8cSopenharmony_ci    ///     ]);
299619625d8cSopenharmony_ci    ///
299719625d8cSopenharmony_ci    /// assert!(res.is_ok());
299819625d8cSopenharmony_ci    /// ```
299919625d8cSopenharmony_ci    ///
300019625d8cSopenharmony_ci    /// Setting [`Arg::required_unless_present_all(names)`] and *not* supplying
300119625d8cSopenharmony_ci    /// either *all* of `unless` args or the `self` arg is an error.
300219625d8cSopenharmony_ci    ///
300319625d8cSopenharmony_ci    /// ```rust
300419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
300519625d8cSopenharmony_ci    /// let res = Command::new("prog")
300619625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
300719625d8cSopenharmony_ci    ///         .required_unless_present_all(["dbg", "infile"])
300819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
300919625d8cSopenharmony_ci    ///         .long("config"))
301019625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
301119625d8cSopenharmony_ci    ///         .long("debug")
301219625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
301319625d8cSopenharmony_ci    ///     .arg(Arg::new("infile")
301419625d8cSopenharmony_ci    ///         .short('i')
301519625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
301619625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
301719625d8cSopenharmony_ci    ///         "prog"
301819625d8cSopenharmony_ci    ///     ]);
301919625d8cSopenharmony_ci    ///
302019625d8cSopenharmony_ci    /// assert!(res.is_err());
302119625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
302219625d8cSopenharmony_ci    /// ```
302319625d8cSopenharmony_ci    /// [required]: Arg::required()
302419625d8cSopenharmony_ci    /// [`Arg::required_unless_present_any`]: Arg::required_unless_present_any()
302519625d8cSopenharmony_ci    /// [`Arg::required_unless_present_all(names)`]: Arg::required_unless_present_all()
302619625d8cSopenharmony_ci    #[must_use]
302719625d8cSopenharmony_ci    pub fn required_unless_present_all(
302819625d8cSopenharmony_ci        mut self,
302919625d8cSopenharmony_ci        names: impl IntoIterator<Item = impl Into<Id>>,
303019625d8cSopenharmony_ci    ) -> Self {
303119625d8cSopenharmony_ci        self.r_unless_all.extend(names.into_iter().map(Into::into));
303219625d8cSopenharmony_ci        self
303319625d8cSopenharmony_ci    }
303419625d8cSopenharmony_ci
303519625d8cSopenharmony_ci    /// Sets this arg as [required] unless *any* of the specified arguments are present at runtime.
303619625d8cSopenharmony_ci    ///
303719625d8cSopenharmony_ci    /// In other words, parsing will succeed only if user either
303819625d8cSopenharmony_ci    /// * supplies the `self` arg.
303919625d8cSopenharmony_ci    /// * supplies *one or more* of the `unless` arguments.
304019625d8cSopenharmony_ci    ///
304119625d8cSopenharmony_ci    /// **NOTE:** If you wish for this argument to be required unless *all of* these args are
304219625d8cSopenharmony_ci    /// present see [`Arg::required_unless_present_all`]
304319625d8cSopenharmony_ci    ///
304419625d8cSopenharmony_ci    /// # Examples
304519625d8cSopenharmony_ci    ///
304619625d8cSopenharmony_ci    /// ```rust
304719625d8cSopenharmony_ci    /// # use clap::Arg;
304819625d8cSopenharmony_ci    /// Arg::new("config")
304919625d8cSopenharmony_ci    ///     .required_unless_present_any(["cfg", "dbg"])
305019625d8cSopenharmony_ci    /// # ;
305119625d8cSopenharmony_ci    /// ```
305219625d8cSopenharmony_ci    ///
305319625d8cSopenharmony_ci    /// Setting [`Arg::required_unless_present_any(names)`] requires that the argument be used at runtime
305419625d8cSopenharmony_ci    /// *unless* *at least one of* the args in `names` are present. In the following example, the
305519625d8cSopenharmony_ci    /// required argument is *not* provided, but it's not an error because one the `unless` args
305619625d8cSopenharmony_ci    /// have been supplied.
305719625d8cSopenharmony_ci    ///
305819625d8cSopenharmony_ci    /// ```rust
305919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
306019625d8cSopenharmony_ci    /// let res = Command::new("prog")
306119625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
306219625d8cSopenharmony_ci    ///         .required_unless_present_any(["dbg", "infile"])
306319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
306419625d8cSopenharmony_ci    ///         .long("config"))
306519625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
306619625d8cSopenharmony_ci    ///         .long("debug")
306719625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
306819625d8cSopenharmony_ci    ///     .arg(Arg::new("infile")
306919625d8cSopenharmony_ci    ///         .short('i')
307019625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
307119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
307219625d8cSopenharmony_ci    ///         "prog", "--debug"
307319625d8cSopenharmony_ci    ///     ]);
307419625d8cSopenharmony_ci    ///
307519625d8cSopenharmony_ci    /// assert!(res.is_ok());
307619625d8cSopenharmony_ci    /// ```
307719625d8cSopenharmony_ci    ///
307819625d8cSopenharmony_ci    /// Setting [`Arg::required_unless_present_any(names)`] and *not* supplying *at least one of* `names`
307919625d8cSopenharmony_ci    /// or this arg is an error.
308019625d8cSopenharmony_ci    ///
308119625d8cSopenharmony_ci    /// ```rust
308219625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
308319625d8cSopenharmony_ci    /// let res = Command::new("prog")
308419625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
308519625d8cSopenharmony_ci    ///         .required_unless_present_any(["dbg", "infile"])
308619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
308719625d8cSopenharmony_ci    ///         .long("config"))
308819625d8cSopenharmony_ci    ///     .arg(Arg::new("dbg")
308919625d8cSopenharmony_ci    ///         .long("debug")
309019625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
309119625d8cSopenharmony_ci    ///     .arg(Arg::new("infile")
309219625d8cSopenharmony_ci    ///         .short('i')
309319625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
309419625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
309519625d8cSopenharmony_ci    ///         "prog"
309619625d8cSopenharmony_ci    ///     ]);
309719625d8cSopenharmony_ci    ///
309819625d8cSopenharmony_ci    /// assert!(res.is_err());
309919625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
310019625d8cSopenharmony_ci    /// ```
310119625d8cSopenharmony_ci    /// [required]: Arg::required()
310219625d8cSopenharmony_ci    /// [`Arg::required_unless_present_any(names)`]: Arg::required_unless_present_any()
310319625d8cSopenharmony_ci    /// [`Arg::required_unless_present_all`]: Arg::required_unless_present_all()
310419625d8cSopenharmony_ci    #[must_use]
310519625d8cSopenharmony_ci    pub fn required_unless_present_any(
310619625d8cSopenharmony_ci        mut self,
310719625d8cSopenharmony_ci        names: impl IntoIterator<Item = impl Into<Id>>,
310819625d8cSopenharmony_ci    ) -> Self {
310919625d8cSopenharmony_ci        self.r_unless.extend(names.into_iter().map(Into::into));
311019625d8cSopenharmony_ci        self
311119625d8cSopenharmony_ci    }
311219625d8cSopenharmony_ci
311319625d8cSopenharmony_ci    /// This argument is [required] only if the specified `arg` is present at runtime and its value
311419625d8cSopenharmony_ci    /// equals `val`.
311519625d8cSopenharmony_ci    ///
311619625d8cSopenharmony_ci    /// # Examples
311719625d8cSopenharmony_ci    ///
311819625d8cSopenharmony_ci    /// ```rust
311919625d8cSopenharmony_ci    /// # use clap::Arg;
312019625d8cSopenharmony_ci    /// Arg::new("config")
312119625d8cSopenharmony_ci    ///     .required_if_eq("other_arg", "value")
312219625d8cSopenharmony_ci    /// # ;
312319625d8cSopenharmony_ci    /// ```
312419625d8cSopenharmony_ci    ///
312519625d8cSopenharmony_ci    /// ```rust
312619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
312719625d8cSopenharmony_ci    /// let res = Command::new("prog")
312819625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
312919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
313019625d8cSopenharmony_ci    ///         .required_if_eq("other", "special")
313119625d8cSopenharmony_ci    ///         .long("config"))
313219625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
313319625d8cSopenharmony_ci    ///         .long("other")
313419625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
313519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
313619625d8cSopenharmony_ci    ///         "prog", "--other", "not-special"
313719625d8cSopenharmony_ci    ///     ]);
313819625d8cSopenharmony_ci    ///
313919625d8cSopenharmony_ci    /// assert!(res.is_ok()); // We didn't use --other=special, so "cfg" wasn't required
314019625d8cSopenharmony_ci    ///
314119625d8cSopenharmony_ci    /// let res = Command::new("prog")
314219625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
314319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
314419625d8cSopenharmony_ci    ///         .required_if_eq("other", "special")
314519625d8cSopenharmony_ci    ///         .long("config"))
314619625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
314719625d8cSopenharmony_ci    ///         .long("other")
314819625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
314919625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
315019625d8cSopenharmony_ci    ///         "prog", "--other", "special"
315119625d8cSopenharmony_ci    ///     ]);
315219625d8cSopenharmony_ci    ///
315319625d8cSopenharmony_ci    /// // We did use --other=special so "cfg" had become required but was missing.
315419625d8cSopenharmony_ci    /// assert!(res.is_err());
315519625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
315619625d8cSopenharmony_ci    ///
315719625d8cSopenharmony_ci    /// let res = Command::new("prog")
315819625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
315919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
316019625d8cSopenharmony_ci    ///         .required_if_eq("other", "special")
316119625d8cSopenharmony_ci    ///         .long("config"))
316219625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
316319625d8cSopenharmony_ci    ///         .long("other")
316419625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
316519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
316619625d8cSopenharmony_ci    ///         "prog", "--other", "SPECIAL"
316719625d8cSopenharmony_ci    ///     ]);
316819625d8cSopenharmony_ci    ///
316919625d8cSopenharmony_ci    /// // By default, the comparison is case-sensitive, so "cfg" wasn't required
317019625d8cSopenharmony_ci    /// assert!(res.is_ok());
317119625d8cSopenharmony_ci    ///
317219625d8cSopenharmony_ci    /// let res = Command::new("prog")
317319625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
317419625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
317519625d8cSopenharmony_ci    ///         .required_if_eq("other", "special")
317619625d8cSopenharmony_ci    ///         .long("config"))
317719625d8cSopenharmony_ci    ///     .arg(Arg::new("other")
317819625d8cSopenharmony_ci    ///         .long("other")
317919625d8cSopenharmony_ci    ///         .ignore_case(true)
318019625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
318119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
318219625d8cSopenharmony_ci    ///         "prog", "--other", "SPECIAL"
318319625d8cSopenharmony_ci    ///     ]);
318419625d8cSopenharmony_ci    ///
318519625d8cSopenharmony_ci    /// // However, case-insensitive comparisons can be enabled.  This typically occurs when using Arg::possible_values().
318619625d8cSopenharmony_ci    /// assert!(res.is_err());
318719625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
318819625d8cSopenharmony_ci    /// ```
318919625d8cSopenharmony_ci    /// [`Arg::requires(name)`]: Arg::requires()
319019625d8cSopenharmony_ci    /// [Conflicting]: Arg::conflicts_with()
319119625d8cSopenharmony_ci    /// [required]: Arg::required()
319219625d8cSopenharmony_ci    #[must_use]
319319625d8cSopenharmony_ci    pub fn required_if_eq(mut self, arg_id: impl Into<Id>, val: impl Into<OsStr>) -> Self {
319419625d8cSopenharmony_ci        self.r_ifs.push((arg_id.into(), val.into()));
319519625d8cSopenharmony_ci        self
319619625d8cSopenharmony_ci    }
319719625d8cSopenharmony_ci
319819625d8cSopenharmony_ci    /// Specify this argument is [required] based on multiple conditions.
319919625d8cSopenharmony_ci    ///
320019625d8cSopenharmony_ci    /// The conditions are set up in a `(arg, val)` style tuple. The requirement will only become
320119625d8cSopenharmony_ci    /// valid if one of the specified `arg`'s value equals its corresponding `val`.
320219625d8cSopenharmony_ci    ///
320319625d8cSopenharmony_ci    /// # Examples
320419625d8cSopenharmony_ci    ///
320519625d8cSopenharmony_ci    /// ```rust
320619625d8cSopenharmony_ci    /// # use clap::Arg;
320719625d8cSopenharmony_ci    /// Arg::new("config")
320819625d8cSopenharmony_ci    ///     .required_if_eq_any([
320919625d8cSopenharmony_ci    ///         ("extra", "val"),
321019625d8cSopenharmony_ci    ///         ("option", "spec")
321119625d8cSopenharmony_ci    ///     ])
321219625d8cSopenharmony_ci    /// # ;
321319625d8cSopenharmony_ci    /// ```
321419625d8cSopenharmony_ci    ///
321519625d8cSopenharmony_ci    /// Setting `Arg::required_if_eq_any([(arg, val)])` makes this arg required if any of the `arg`s
321619625d8cSopenharmony_ci    /// are used at runtime and it's corresponding value is equal to `val`. If the `arg`'s value is
321719625d8cSopenharmony_ci    /// anything other than `val`, this argument isn't required.
321819625d8cSopenharmony_ci    ///
321919625d8cSopenharmony_ci    /// ```rust
322019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
322119625d8cSopenharmony_ci    /// let res = Command::new("prog")
322219625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
322319625d8cSopenharmony_ci    ///         .required_if_eq_any([
322419625d8cSopenharmony_ci    ///             ("extra", "val"),
322519625d8cSopenharmony_ci    ///             ("option", "spec")
322619625d8cSopenharmony_ci    ///         ])
322719625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
322819625d8cSopenharmony_ci    ///         .long("config"))
322919625d8cSopenharmony_ci    ///     .arg(Arg::new("extra")
323019625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
323119625d8cSopenharmony_ci    ///         .long("extra"))
323219625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
323319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
323419625d8cSopenharmony_ci    ///         .long("option"))
323519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
323619625d8cSopenharmony_ci    ///         "prog", "--option", "other"
323719625d8cSopenharmony_ci    ///     ]);
323819625d8cSopenharmony_ci    ///
323919625d8cSopenharmony_ci    /// assert!(res.is_ok()); // We didn't use --option=spec, or --extra=val so "cfg" isn't required
324019625d8cSopenharmony_ci    /// ```
324119625d8cSopenharmony_ci    ///
324219625d8cSopenharmony_ci    /// Setting `Arg::required_if_eq_any([(arg, val)])` and having any of the `arg`s used with its
324319625d8cSopenharmony_ci    /// value of `val` but *not* using this arg is an error.
324419625d8cSopenharmony_ci    ///
324519625d8cSopenharmony_ci    /// ```rust
324619625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
324719625d8cSopenharmony_ci    /// let res = Command::new("prog")
324819625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
324919625d8cSopenharmony_ci    ///         .required_if_eq_any([
325019625d8cSopenharmony_ci    ///             ("extra", "val"),
325119625d8cSopenharmony_ci    ///             ("option", "spec")
325219625d8cSopenharmony_ci    ///         ])
325319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
325419625d8cSopenharmony_ci    ///         .long("config"))
325519625d8cSopenharmony_ci    ///     .arg(Arg::new("extra")
325619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
325719625d8cSopenharmony_ci    ///         .long("extra"))
325819625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
325919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
326019625d8cSopenharmony_ci    ///         .long("option"))
326119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
326219625d8cSopenharmony_ci    ///         "prog", "--option", "spec"
326319625d8cSopenharmony_ci    ///     ]);
326419625d8cSopenharmony_ci    ///
326519625d8cSopenharmony_ci    /// assert!(res.is_err());
326619625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
326719625d8cSopenharmony_ci    /// ```
326819625d8cSopenharmony_ci    /// [`Arg::requires(name)`]: Arg::requires()
326919625d8cSopenharmony_ci    /// [Conflicting]: Arg::conflicts_with()
327019625d8cSopenharmony_ci    /// [required]: Arg::required()
327119625d8cSopenharmony_ci    #[must_use]
327219625d8cSopenharmony_ci    pub fn required_if_eq_any(
327319625d8cSopenharmony_ci        mut self,
327419625d8cSopenharmony_ci        ifs: impl IntoIterator<Item = (impl Into<Id>, impl Into<OsStr>)>,
327519625d8cSopenharmony_ci    ) -> Self {
327619625d8cSopenharmony_ci        self.r_ifs
327719625d8cSopenharmony_ci            .extend(ifs.into_iter().map(|(id, val)| (id.into(), val.into())));
327819625d8cSopenharmony_ci        self
327919625d8cSopenharmony_ci    }
328019625d8cSopenharmony_ci
328119625d8cSopenharmony_ci    /// Specify this argument is [required] based on multiple conditions.
328219625d8cSopenharmony_ci    ///
328319625d8cSopenharmony_ci    /// The conditions are set up in a `(arg, val)` style tuple. The requirement will only become
328419625d8cSopenharmony_ci    /// valid if every one of the specified `arg`'s value equals its corresponding `val`.
328519625d8cSopenharmony_ci    ///
328619625d8cSopenharmony_ci    /// # Examples
328719625d8cSopenharmony_ci    ///
328819625d8cSopenharmony_ci    /// ```rust
328919625d8cSopenharmony_ci    /// # use clap::Arg;
329019625d8cSopenharmony_ci    /// Arg::new("config")
329119625d8cSopenharmony_ci    ///     .required_if_eq_all([
329219625d8cSopenharmony_ci    ///         ("extra", "val"),
329319625d8cSopenharmony_ci    ///         ("option", "spec")
329419625d8cSopenharmony_ci    ///     ])
329519625d8cSopenharmony_ci    /// # ;
329619625d8cSopenharmony_ci    /// ```
329719625d8cSopenharmony_ci    ///
329819625d8cSopenharmony_ci    /// Setting `Arg::required_if_eq_all([(arg, val)])` makes this arg required if all of the `arg`s
329919625d8cSopenharmony_ci    /// are used at runtime and every value is equal to its corresponding `val`. If the `arg`'s value is
330019625d8cSopenharmony_ci    /// anything other than `val`, this argument isn't required.
330119625d8cSopenharmony_ci    ///
330219625d8cSopenharmony_ci    /// ```rust
330319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
330419625d8cSopenharmony_ci    /// let res = Command::new("prog")
330519625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
330619625d8cSopenharmony_ci    ///         .required_if_eq_all([
330719625d8cSopenharmony_ci    ///             ("extra", "val"),
330819625d8cSopenharmony_ci    ///             ("option", "spec")
330919625d8cSopenharmony_ci    ///         ])
331019625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
331119625d8cSopenharmony_ci    ///         .long("config"))
331219625d8cSopenharmony_ci    ///     .arg(Arg::new("extra")
331319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
331419625d8cSopenharmony_ci    ///         .long("extra"))
331519625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
331619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
331719625d8cSopenharmony_ci    ///         .long("option"))
331819625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
331919625d8cSopenharmony_ci    ///         "prog", "--option", "spec"
332019625d8cSopenharmony_ci    ///     ]);
332119625d8cSopenharmony_ci    ///
332219625d8cSopenharmony_ci    /// assert!(res.is_ok()); // We didn't use --option=spec --extra=val so "cfg" isn't required
332319625d8cSopenharmony_ci    /// ```
332419625d8cSopenharmony_ci    ///
332519625d8cSopenharmony_ci    /// Setting `Arg::required_if_eq_all([(arg, val)])` and having all of the `arg`s used with its
332619625d8cSopenharmony_ci    /// value of `val` but *not* using this arg is an error.
332719625d8cSopenharmony_ci    ///
332819625d8cSopenharmony_ci    /// ```rust
332919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
333019625d8cSopenharmony_ci    /// let res = Command::new("prog")
333119625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
333219625d8cSopenharmony_ci    ///         .required_if_eq_all([
333319625d8cSopenharmony_ci    ///             ("extra", "val"),
333419625d8cSopenharmony_ci    ///             ("option", "spec")
333519625d8cSopenharmony_ci    ///         ])
333619625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
333719625d8cSopenharmony_ci    ///         .long("config"))
333819625d8cSopenharmony_ci    ///     .arg(Arg::new("extra")
333919625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
334019625d8cSopenharmony_ci    ///         .long("extra"))
334119625d8cSopenharmony_ci    ///     .arg(Arg::new("option")
334219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
334319625d8cSopenharmony_ci    ///         .long("option"))
334419625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
334519625d8cSopenharmony_ci    ///         "prog", "--extra", "val", "--option", "spec"
334619625d8cSopenharmony_ci    ///     ]);
334719625d8cSopenharmony_ci    ///
334819625d8cSopenharmony_ci    /// assert!(res.is_err());
334919625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
335019625d8cSopenharmony_ci    /// ```
335119625d8cSopenharmony_ci    /// [required]: Arg::required()
335219625d8cSopenharmony_ci    #[must_use]
335319625d8cSopenharmony_ci    pub fn required_if_eq_all(
335419625d8cSopenharmony_ci        mut self,
335519625d8cSopenharmony_ci        ifs: impl IntoIterator<Item = (impl Into<Id>, impl Into<OsStr>)>,
335619625d8cSopenharmony_ci    ) -> Self {
335719625d8cSopenharmony_ci        self.r_ifs_all
335819625d8cSopenharmony_ci            .extend(ifs.into_iter().map(|(id, val)| (id.into(), val.into())));
335919625d8cSopenharmony_ci        self
336019625d8cSopenharmony_ci    }
336119625d8cSopenharmony_ci
336219625d8cSopenharmony_ci    /// Require another argument if this arg matches the [`ArgPredicate`]
336319625d8cSopenharmony_ci    ///
336419625d8cSopenharmony_ci    /// This method takes `value, another_arg` pair. At runtime, clap will check
336519625d8cSopenharmony_ci    /// if this arg (`self`) matches the [`ArgPredicate`].
336619625d8cSopenharmony_ci    /// If it does, `another_arg` will be marked as required.
336719625d8cSopenharmony_ci    ///
336819625d8cSopenharmony_ci    /// # Examples
336919625d8cSopenharmony_ci    ///
337019625d8cSopenharmony_ci    /// ```rust
337119625d8cSopenharmony_ci    /// # use clap::Arg;
337219625d8cSopenharmony_ci    /// Arg::new("config")
337319625d8cSopenharmony_ci    ///     .requires_if("val", "arg")
337419625d8cSopenharmony_ci    /// # ;
337519625d8cSopenharmony_ci    /// ```
337619625d8cSopenharmony_ci    ///
337719625d8cSopenharmony_ci    /// Setting `Arg::requires_if(val, arg)` requires that the `arg` be used at runtime if the
337819625d8cSopenharmony_ci    /// defining argument's value is equal to `val`. If the defining argument is anything other than
337919625d8cSopenharmony_ci    /// `val`, the other argument isn't required.
338019625d8cSopenharmony_ci    ///
338119625d8cSopenharmony_ci    /// ```rust
338219625d8cSopenharmony_ci    /// # use clap::{Command, Arg, ArgAction};
338319625d8cSopenharmony_ci    /// let res = Command::new("prog")
338419625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
338519625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
338619625d8cSopenharmony_ci    ///         .requires_if("my.cfg", "other")
338719625d8cSopenharmony_ci    ///         .long("config"))
338819625d8cSopenharmony_ci    ///     .arg(Arg::new("other"))
338919625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
339019625d8cSopenharmony_ci    ///         "prog", "--config", "some.cfg"
339119625d8cSopenharmony_ci    ///     ]);
339219625d8cSopenharmony_ci    ///
339319625d8cSopenharmony_ci    /// assert!(res.is_ok()); // We didn't use --config=my.cfg, so other wasn't required
339419625d8cSopenharmony_ci    /// ```
339519625d8cSopenharmony_ci    ///
339619625d8cSopenharmony_ci    /// Setting `Arg::requires_if(val, arg)` and setting the value to `val` but *not* supplying
339719625d8cSopenharmony_ci    /// `arg` is an error.
339819625d8cSopenharmony_ci    ///
339919625d8cSopenharmony_ci    /// ```rust
340019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
340119625d8cSopenharmony_ci    /// let res = Command::new("prog")
340219625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
340319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
340419625d8cSopenharmony_ci    ///         .requires_if("my.cfg", "input")
340519625d8cSopenharmony_ci    ///         .long("config"))
340619625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
340719625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
340819625d8cSopenharmony_ci    ///         "prog", "--config", "my.cfg"
340919625d8cSopenharmony_ci    ///     ]);
341019625d8cSopenharmony_ci    ///
341119625d8cSopenharmony_ci    /// assert!(res.is_err());
341219625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
341319625d8cSopenharmony_ci    /// ```
341419625d8cSopenharmony_ci    /// [`Arg::requires(name)`]: Arg::requires()
341519625d8cSopenharmony_ci    /// [Conflicting]: Arg::conflicts_with()
341619625d8cSopenharmony_ci    /// [override]: Arg::overrides_with()
341719625d8cSopenharmony_ci    #[must_use]
341819625d8cSopenharmony_ci    pub fn requires_if(mut self, val: impl Into<ArgPredicate>, arg_id: impl Into<Id>) -> Self {
341919625d8cSopenharmony_ci        self.requires.push((val.into(), arg_id.into()));
342019625d8cSopenharmony_ci        self
342119625d8cSopenharmony_ci    }
342219625d8cSopenharmony_ci
342319625d8cSopenharmony_ci    /// Allows multiple conditional requirements.
342419625d8cSopenharmony_ci    ///
342519625d8cSopenharmony_ci    /// The requirement will only become valid if this arg's value matches the
342619625d8cSopenharmony_ci    /// [`ArgPredicate`].
342719625d8cSopenharmony_ci    ///
342819625d8cSopenharmony_ci    /// # Examples
342919625d8cSopenharmony_ci    ///
343019625d8cSopenharmony_ci    /// ```rust
343119625d8cSopenharmony_ci    /// # use clap::Arg;
343219625d8cSopenharmony_ci    /// Arg::new("config")
343319625d8cSopenharmony_ci    ///     .requires_ifs([
343419625d8cSopenharmony_ci    ///         ("val", "arg"),
343519625d8cSopenharmony_ci    ///         ("other_val", "arg2"),
343619625d8cSopenharmony_ci    ///     ])
343719625d8cSopenharmony_ci    /// # ;
343819625d8cSopenharmony_ci    /// ```
343919625d8cSopenharmony_ci    ///
344019625d8cSopenharmony_ci    /// Setting `Arg::requires_ifs(["val", "arg"])` requires that the `arg` be used at runtime if the
344119625d8cSopenharmony_ci    /// defining argument's value is equal to `val`. If the defining argument's value is anything other
344219625d8cSopenharmony_ci    /// than `val`, `arg` isn't required.
344319625d8cSopenharmony_ci    ///
344419625d8cSopenharmony_ci    /// ```rust
344519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
344619625d8cSopenharmony_ci    /// let res = Command::new("prog")
344719625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
344819625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
344919625d8cSopenharmony_ci    ///         .requires_ifs([
345019625d8cSopenharmony_ci    ///             ("special.conf", "opt"),
345119625d8cSopenharmony_ci    ///             ("other.conf", "other"),
345219625d8cSopenharmony_ci    ///         ])
345319625d8cSopenharmony_ci    ///         .long("config"))
345419625d8cSopenharmony_ci    ///     .arg(Arg::new("opt")
345519625d8cSopenharmony_ci    ///         .long("option")
345619625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
345719625d8cSopenharmony_ci    ///     .arg(Arg::new("other"))
345819625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
345919625d8cSopenharmony_ci    ///         "prog", "--config", "special.conf"
346019625d8cSopenharmony_ci    ///     ]);
346119625d8cSopenharmony_ci    ///
346219625d8cSopenharmony_ci    /// assert!(res.is_err()); // We  used --config=special.conf so --option <val> is required
346319625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
346419625d8cSopenharmony_ci    /// ```
346519625d8cSopenharmony_ci    ///
346619625d8cSopenharmony_ci    /// Setting `Arg::requires_ifs` with [`ArgPredicate::IsPresent`] and *not* supplying all the
346719625d8cSopenharmony_ci    /// arguments is an error.
346819625d8cSopenharmony_ci    ///
346919625d8cSopenharmony_ci    /// ```rust
347019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction, builder::ArgPredicate};
347119625d8cSopenharmony_ci    /// let res = Command::new("prog")
347219625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
347319625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
347419625d8cSopenharmony_ci    ///         .requires_ifs([
347519625d8cSopenharmony_ci    ///             (ArgPredicate::IsPresent, "input"),
347619625d8cSopenharmony_ci    ///             (ArgPredicate::IsPresent, "output"),
347719625d8cSopenharmony_ci    ///         ])
347819625d8cSopenharmony_ci    ///         .long("config"))
347919625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
348019625d8cSopenharmony_ci    ///     .arg(Arg::new("output"))
348119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
348219625d8cSopenharmony_ci    ///         "prog", "--config", "file.conf", "in.txt"
348319625d8cSopenharmony_ci    ///     ]);
348419625d8cSopenharmony_ci    ///
348519625d8cSopenharmony_ci    /// assert!(res.is_err());
348619625d8cSopenharmony_ci    /// // We didn't use output
348719625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
348819625d8cSopenharmony_ci    /// ```
348919625d8cSopenharmony_ci    ///
349019625d8cSopenharmony_ci    /// [`Arg::requires(name)`]: Arg::requires()
349119625d8cSopenharmony_ci    /// [Conflicting]: Arg::conflicts_with()
349219625d8cSopenharmony_ci    /// [override]: Arg::overrides_with()
349319625d8cSopenharmony_ci    #[must_use]
349419625d8cSopenharmony_ci    pub fn requires_ifs(
349519625d8cSopenharmony_ci        mut self,
349619625d8cSopenharmony_ci        ifs: impl IntoIterator<Item = (impl Into<ArgPredicate>, impl Into<Id>)>,
349719625d8cSopenharmony_ci    ) -> Self {
349819625d8cSopenharmony_ci        self.requires
349919625d8cSopenharmony_ci            .extend(ifs.into_iter().map(|(val, arg)| (val.into(), arg.into())));
350019625d8cSopenharmony_ci        self
350119625d8cSopenharmony_ci    }
350219625d8cSopenharmony_ci
350319625d8cSopenharmony_ci    #[doc(hidden)]
350419625d8cSopenharmony_ci    #[cfg_attr(
350519625d8cSopenharmony_ci        feature = "deprecated",
350619625d8cSopenharmony_ci        deprecated(since = "4.0.0", note = "Replaced with `Arg::requires_ifs`")
350719625d8cSopenharmony_ci    )]
350819625d8cSopenharmony_ci    pub fn requires_all(self, ids: impl IntoIterator<Item = impl Into<Id>>) -> Self {
350919625d8cSopenharmony_ci        self.requires_ifs(ids.into_iter().map(|id| (ArgPredicate::IsPresent, id)))
351019625d8cSopenharmony_ci    }
351119625d8cSopenharmony_ci
351219625d8cSopenharmony_ci    /// This argument is mutually exclusive with the specified argument.
351319625d8cSopenharmony_ci    ///
351419625d8cSopenharmony_ci    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
351519625d8cSopenharmony_ci    /// only need to be set for one of the two arguments, they do not need to be set for each.
351619625d8cSopenharmony_ci    ///
351719625d8cSopenharmony_ci    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
351819625d8cSopenharmony_ci    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not
351919625d8cSopenharmony_ci    /// need to also do B.conflicts_with(A))
352019625d8cSopenharmony_ci    ///
352119625d8cSopenharmony_ci    /// **NOTE:** [`Arg::conflicts_with_all(names)`] allows specifying an argument which conflicts with more than one argument.
352219625d8cSopenharmony_ci    ///
352319625d8cSopenharmony_ci    /// **NOTE** [`Arg::exclusive(true)`] allows specifying an argument which conflicts with every other argument.
352419625d8cSopenharmony_ci    ///
352519625d8cSopenharmony_ci    /// **NOTE:** All arguments implicitly conflict with themselves.
352619625d8cSopenharmony_ci    ///
352719625d8cSopenharmony_ci    /// # Examples
352819625d8cSopenharmony_ci    ///
352919625d8cSopenharmony_ci    /// ```rust
353019625d8cSopenharmony_ci    /// # use clap::Arg;
353119625d8cSopenharmony_ci    /// Arg::new("config")
353219625d8cSopenharmony_ci    ///     .conflicts_with("debug")
353319625d8cSopenharmony_ci    /// # ;
353419625d8cSopenharmony_ci    /// ```
353519625d8cSopenharmony_ci    ///
353619625d8cSopenharmony_ci    /// Setting conflicting argument, and having both arguments present at runtime is an error.
353719625d8cSopenharmony_ci    ///
353819625d8cSopenharmony_ci    /// ```rust
353919625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
354019625d8cSopenharmony_ci    /// let res = Command::new("prog")
354119625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
354219625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
354319625d8cSopenharmony_ci    ///         .conflicts_with("debug")
354419625d8cSopenharmony_ci    ///         .long("config"))
354519625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
354619625d8cSopenharmony_ci    ///         .long("debug")
354719625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
354819625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
354919625d8cSopenharmony_ci    ///         "prog", "--debug", "--config", "file.conf"
355019625d8cSopenharmony_ci    ///     ]);
355119625d8cSopenharmony_ci    ///
355219625d8cSopenharmony_ci    /// assert!(res.is_err());
355319625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);
355419625d8cSopenharmony_ci    /// ```
355519625d8cSopenharmony_ci    ///
355619625d8cSopenharmony_ci    /// [`Arg::conflicts_with_all(names)`]: Arg::conflicts_with_all()
355719625d8cSopenharmony_ci    /// [`Arg::exclusive(true)`]: Arg::exclusive()
355819625d8cSopenharmony_ci    #[must_use]
355919625d8cSopenharmony_ci    pub fn conflicts_with(mut self, arg_id: impl IntoResettable<Id>) -> Self {
356019625d8cSopenharmony_ci        if let Some(arg_id) = arg_id.into_resettable().into_option() {
356119625d8cSopenharmony_ci            self.blacklist.push(arg_id);
356219625d8cSopenharmony_ci        } else {
356319625d8cSopenharmony_ci            self.blacklist.clear();
356419625d8cSopenharmony_ci        }
356519625d8cSopenharmony_ci        self
356619625d8cSopenharmony_ci    }
356719625d8cSopenharmony_ci
356819625d8cSopenharmony_ci    /// This argument is mutually exclusive with the specified arguments.
356919625d8cSopenharmony_ci    ///
357019625d8cSopenharmony_ci    /// See [`Arg::conflicts_with`].
357119625d8cSopenharmony_ci    ///
357219625d8cSopenharmony_ci    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
357319625d8cSopenharmony_ci    /// only need to be set for one of the two arguments, they do not need to be set for each.
357419625d8cSopenharmony_ci    ///
357519625d8cSopenharmony_ci    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
357619625d8cSopenharmony_ci    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not need
357719625d8cSopenharmony_ci    /// need to also do B.conflicts_with(A))
357819625d8cSopenharmony_ci    ///
357919625d8cSopenharmony_ci    /// **NOTE:** [`Arg::exclusive(true)`] allows specifying an argument which conflicts with every other argument.
358019625d8cSopenharmony_ci    ///
358119625d8cSopenharmony_ci    /// # Examples
358219625d8cSopenharmony_ci    ///
358319625d8cSopenharmony_ci    /// ```rust
358419625d8cSopenharmony_ci    /// # use clap::Arg;
358519625d8cSopenharmony_ci    /// Arg::new("config")
358619625d8cSopenharmony_ci    ///     .conflicts_with_all(["debug", "input"])
358719625d8cSopenharmony_ci    /// # ;
358819625d8cSopenharmony_ci    /// ```
358919625d8cSopenharmony_ci    ///
359019625d8cSopenharmony_ci    /// Setting conflicting argument, and having any of the arguments present at runtime with a
359119625d8cSopenharmony_ci    /// conflicting argument is an error.
359219625d8cSopenharmony_ci    ///
359319625d8cSopenharmony_ci    /// ```rust
359419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
359519625d8cSopenharmony_ci    /// let res = Command::new("prog")
359619625d8cSopenharmony_ci    ///     .arg(Arg::new("cfg")
359719625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
359819625d8cSopenharmony_ci    ///         .conflicts_with_all(["debug", "input"])
359919625d8cSopenharmony_ci    ///         .long("config"))
360019625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
360119625d8cSopenharmony_ci    ///         .long("debug"))
360219625d8cSopenharmony_ci    ///     .arg(Arg::new("input"))
360319625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
360419625d8cSopenharmony_ci    ///         "prog", "--config", "file.conf", "file.txt"
360519625d8cSopenharmony_ci    ///     ]);
360619625d8cSopenharmony_ci    ///
360719625d8cSopenharmony_ci    /// assert!(res.is_err());
360819625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::ArgumentConflict);
360919625d8cSopenharmony_ci    /// ```
361019625d8cSopenharmony_ci    /// [`Arg::conflicts_with`]: Arg::conflicts_with()
361119625d8cSopenharmony_ci    /// [`Arg::exclusive(true)`]: Arg::exclusive()
361219625d8cSopenharmony_ci    #[must_use]
361319625d8cSopenharmony_ci    pub fn conflicts_with_all(mut self, names: impl IntoIterator<Item = impl Into<Id>>) -> Self {
361419625d8cSopenharmony_ci        self.blacklist.extend(names.into_iter().map(Into::into));
361519625d8cSopenharmony_ci        self
361619625d8cSopenharmony_ci    }
361719625d8cSopenharmony_ci
361819625d8cSopenharmony_ci    /// Sets an overridable argument.
361919625d8cSopenharmony_ci    ///
362019625d8cSopenharmony_ci    /// i.e. this argument and the following argument
362119625d8cSopenharmony_ci    /// will override each other in POSIX style (whichever argument was specified at runtime
362219625d8cSopenharmony_ci    /// **last** "wins")
362319625d8cSopenharmony_ci    ///
362419625d8cSopenharmony_ci    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
362519625d8cSopenharmony_ci    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
362619625d8cSopenharmony_ci    ///
362719625d8cSopenharmony_ci    /// **NOTE:** Overriding an argument implies they [conflict][Arg::conflicts_with`].
362819625d8cSopenharmony_ci    ///
362919625d8cSopenharmony_ci    /// # Examples
363019625d8cSopenharmony_ci    ///
363119625d8cSopenharmony_ci    /// ```rust
363219625d8cSopenharmony_ci    /// # use clap::{Command, arg};
363319625d8cSopenharmony_ci    /// let m = Command::new("prog")
363419625d8cSopenharmony_ci    ///     .arg(arg!(-f --flag "some flag")
363519625d8cSopenharmony_ci    ///         .conflicts_with("debug"))
363619625d8cSopenharmony_ci    ///     .arg(arg!(-d --debug "other flag"))
363719625d8cSopenharmony_ci    ///     .arg(arg!(-c --color "third flag")
363819625d8cSopenharmony_ci    ///         .overrides_with("flag"))
363919625d8cSopenharmony_ci    ///     .get_matches_from(vec![
364019625d8cSopenharmony_ci    ///         "prog", "-f", "-d", "-c"]);
364119625d8cSopenharmony_ci    ///             //    ^~~~~~~~~~~~^~~~~ flag is overridden by color
364219625d8cSopenharmony_ci    ///
364319625d8cSopenharmony_ci    /// assert!(m.get_flag("color"));
364419625d8cSopenharmony_ci    /// assert!(m.get_flag("debug")); // even though flag conflicts with debug, it's as if flag
364519625d8cSopenharmony_ci    ///                                 // was never used because it was overridden with color
364619625d8cSopenharmony_ci    /// assert!(!m.get_flag("flag"));
364719625d8cSopenharmony_ci    /// ```
364819625d8cSopenharmony_ci    #[must_use]
364919625d8cSopenharmony_ci    pub fn overrides_with(mut self, arg_id: impl IntoResettable<Id>) -> Self {
365019625d8cSopenharmony_ci        if let Some(arg_id) = arg_id.into_resettable().into_option() {
365119625d8cSopenharmony_ci            self.overrides.push(arg_id);
365219625d8cSopenharmony_ci        } else {
365319625d8cSopenharmony_ci            self.overrides.clear();
365419625d8cSopenharmony_ci        }
365519625d8cSopenharmony_ci        self
365619625d8cSopenharmony_ci    }
365719625d8cSopenharmony_ci
365819625d8cSopenharmony_ci    /// Sets multiple mutually overridable arguments by name.
365919625d8cSopenharmony_ci    ///
366019625d8cSopenharmony_ci    /// i.e. this argument and the following argument will override each other in POSIX style
366119625d8cSopenharmony_ci    /// (whichever argument was specified at runtime **last** "wins")
366219625d8cSopenharmony_ci    ///
366319625d8cSopenharmony_ci    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
366419625d8cSopenharmony_ci    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
366519625d8cSopenharmony_ci    ///
366619625d8cSopenharmony_ci    /// **NOTE:** Overriding an argument implies they [conflict][Arg::conflicts_with_all`].
366719625d8cSopenharmony_ci    ///
366819625d8cSopenharmony_ci    /// # Examples
366919625d8cSopenharmony_ci    ///
367019625d8cSopenharmony_ci    /// ```rust
367119625d8cSopenharmony_ci    /// # use clap::{Command, arg};
367219625d8cSopenharmony_ci    /// let m = Command::new("prog")
367319625d8cSopenharmony_ci    ///     .arg(arg!(-f --flag "some flag")
367419625d8cSopenharmony_ci    ///         .conflicts_with("color"))
367519625d8cSopenharmony_ci    ///     .arg(arg!(-d --debug "other flag"))
367619625d8cSopenharmony_ci    ///     .arg(arg!(-c --color "third flag")
367719625d8cSopenharmony_ci    ///         .overrides_with_all(["flag", "debug"]))
367819625d8cSopenharmony_ci    ///     .get_matches_from(vec![
367919625d8cSopenharmony_ci    ///         "prog", "-f", "-d", "-c"]);
368019625d8cSopenharmony_ci    ///             //    ^~~~~~^~~~~~~~~ flag and debug are overridden by color
368119625d8cSopenharmony_ci    ///
368219625d8cSopenharmony_ci    /// assert!(m.get_flag("color")); // even though flag conflicts with color, it's as if flag
368319625d8cSopenharmony_ci    ///                                 // and debug were never used because they were overridden
368419625d8cSopenharmony_ci    ///                                 // with color
368519625d8cSopenharmony_ci    /// assert!(!m.get_flag("debug"));
368619625d8cSopenharmony_ci    /// assert!(!m.get_flag("flag"));
368719625d8cSopenharmony_ci    /// ```
368819625d8cSopenharmony_ci    #[must_use]
368919625d8cSopenharmony_ci    pub fn overrides_with_all(mut self, names: impl IntoIterator<Item = impl Into<Id>>) -> Self {
369019625d8cSopenharmony_ci        self.overrides.extend(names.into_iter().map(Into::into));
369119625d8cSopenharmony_ci        self
369219625d8cSopenharmony_ci    }
369319625d8cSopenharmony_ci}
369419625d8cSopenharmony_ci
369519625d8cSopenharmony_ci/// # Reflection
369619625d8cSopenharmony_ciimpl Arg {
369719625d8cSopenharmony_ci    /// Get the name of the argument
369819625d8cSopenharmony_ci    #[inline]
369919625d8cSopenharmony_ci    pub fn get_id(&self) -> &Id {
370019625d8cSopenharmony_ci        &self.id
370119625d8cSopenharmony_ci    }
370219625d8cSopenharmony_ci
370319625d8cSopenharmony_ci    /// Get the help specified for this argument, if any
370419625d8cSopenharmony_ci    #[inline]
370519625d8cSopenharmony_ci    pub fn get_help(&self) -> Option<&StyledStr> {
370619625d8cSopenharmony_ci        self.help.as_ref()
370719625d8cSopenharmony_ci    }
370819625d8cSopenharmony_ci
370919625d8cSopenharmony_ci    /// Get the long help specified for this argument, if any
371019625d8cSopenharmony_ci    ///
371119625d8cSopenharmony_ci    /// # Examples
371219625d8cSopenharmony_ci    ///
371319625d8cSopenharmony_ci    /// ```rust
371419625d8cSopenharmony_ci    /// # use clap::Arg;
371519625d8cSopenharmony_ci    /// let arg = Arg::new("foo").long_help("long help");
371619625d8cSopenharmony_ci    /// assert_eq!(Some("long help".to_owned()), arg.get_long_help().map(|s| s.to_string()));
371719625d8cSopenharmony_ci    /// ```
371819625d8cSopenharmony_ci    ///
371919625d8cSopenharmony_ci    #[inline]
372019625d8cSopenharmony_ci    pub fn get_long_help(&self) -> Option<&StyledStr> {
372119625d8cSopenharmony_ci        self.long_help.as_ref()
372219625d8cSopenharmony_ci    }
372319625d8cSopenharmony_ci
372419625d8cSopenharmony_ci    /// Get the help heading specified for this argument, if any
372519625d8cSopenharmony_ci    #[inline]
372619625d8cSopenharmony_ci    pub fn get_help_heading(&self) -> Option<&str> {
372719625d8cSopenharmony_ci        self.help_heading
372819625d8cSopenharmony_ci            .as_ref()
372919625d8cSopenharmony_ci            .map(|s| s.as_deref())
373019625d8cSopenharmony_ci            .unwrap_or_default()
373119625d8cSopenharmony_ci    }
373219625d8cSopenharmony_ci
373319625d8cSopenharmony_ci    /// Get the short option name for this argument, if any
373419625d8cSopenharmony_ci    #[inline]
373519625d8cSopenharmony_ci    pub fn get_short(&self) -> Option<char> {
373619625d8cSopenharmony_ci        self.short
373719625d8cSopenharmony_ci    }
373819625d8cSopenharmony_ci
373919625d8cSopenharmony_ci    /// Get visible short aliases for this argument, if any
374019625d8cSopenharmony_ci    #[inline]
374119625d8cSopenharmony_ci    pub fn get_visible_short_aliases(&self) -> Option<Vec<char>> {
374219625d8cSopenharmony_ci        if self.short_aliases.is_empty() {
374319625d8cSopenharmony_ci            None
374419625d8cSopenharmony_ci        } else {
374519625d8cSopenharmony_ci            Some(
374619625d8cSopenharmony_ci                self.short_aliases
374719625d8cSopenharmony_ci                    .iter()
374819625d8cSopenharmony_ci                    .filter_map(|(c, v)| if *v { Some(c) } else { None })
374919625d8cSopenharmony_ci                    .copied()
375019625d8cSopenharmony_ci                    .collect(),
375119625d8cSopenharmony_ci            )
375219625d8cSopenharmony_ci        }
375319625d8cSopenharmony_ci    }
375419625d8cSopenharmony_ci
375519625d8cSopenharmony_ci    /// Get *all* short aliases for this argument, if any, both visible and hidden.
375619625d8cSopenharmony_ci    #[inline]
375719625d8cSopenharmony_ci    pub fn get_all_short_aliases(&self) -> Option<Vec<char>> {
375819625d8cSopenharmony_ci        if self.short_aliases.is_empty() {
375919625d8cSopenharmony_ci            None
376019625d8cSopenharmony_ci        } else {
376119625d8cSopenharmony_ci            Some(self.short_aliases.iter().map(|(s, _)| s).copied().collect())
376219625d8cSopenharmony_ci        }
376319625d8cSopenharmony_ci    }
376419625d8cSopenharmony_ci
376519625d8cSopenharmony_ci    /// Get the short option name and its visible aliases, if any
376619625d8cSopenharmony_ci    #[inline]
376719625d8cSopenharmony_ci    pub fn get_short_and_visible_aliases(&self) -> Option<Vec<char>> {
376819625d8cSopenharmony_ci        let mut shorts = match self.short {
376919625d8cSopenharmony_ci            Some(short) => vec![short],
377019625d8cSopenharmony_ci            None => return None,
377119625d8cSopenharmony_ci        };
377219625d8cSopenharmony_ci        if let Some(aliases) = self.get_visible_short_aliases() {
377319625d8cSopenharmony_ci            shorts.extend(aliases);
377419625d8cSopenharmony_ci        }
377519625d8cSopenharmony_ci        Some(shorts)
377619625d8cSopenharmony_ci    }
377719625d8cSopenharmony_ci
377819625d8cSopenharmony_ci    /// Get the long option name for this argument, if any
377919625d8cSopenharmony_ci    #[inline]
378019625d8cSopenharmony_ci    pub fn get_long(&self) -> Option<&str> {
378119625d8cSopenharmony_ci        self.long.as_deref()
378219625d8cSopenharmony_ci    }
378319625d8cSopenharmony_ci
378419625d8cSopenharmony_ci    /// Get visible aliases for this argument, if any
378519625d8cSopenharmony_ci    #[inline]
378619625d8cSopenharmony_ci    pub fn get_visible_aliases(&self) -> Option<Vec<&str>> {
378719625d8cSopenharmony_ci        if self.aliases.is_empty() {
378819625d8cSopenharmony_ci            None
378919625d8cSopenharmony_ci        } else {
379019625d8cSopenharmony_ci            Some(
379119625d8cSopenharmony_ci                self.aliases
379219625d8cSopenharmony_ci                    .iter()
379319625d8cSopenharmony_ci                    .filter_map(|(s, v)| if *v { Some(s.as_str()) } else { None })
379419625d8cSopenharmony_ci                    .collect(),
379519625d8cSopenharmony_ci            )
379619625d8cSopenharmony_ci        }
379719625d8cSopenharmony_ci    }
379819625d8cSopenharmony_ci
379919625d8cSopenharmony_ci    /// Get *all* aliases for this argument, if any, both visible and hidden.
380019625d8cSopenharmony_ci    #[inline]
380119625d8cSopenharmony_ci    pub fn get_all_aliases(&self) -> Option<Vec<&str>> {
380219625d8cSopenharmony_ci        if self.aliases.is_empty() {
380319625d8cSopenharmony_ci            None
380419625d8cSopenharmony_ci        } else {
380519625d8cSopenharmony_ci            Some(self.aliases.iter().map(|(s, _)| s.as_str()).collect())
380619625d8cSopenharmony_ci        }
380719625d8cSopenharmony_ci    }
380819625d8cSopenharmony_ci
380919625d8cSopenharmony_ci    /// Get the long option name and its visible aliases, if any
381019625d8cSopenharmony_ci    #[inline]
381119625d8cSopenharmony_ci    pub fn get_long_and_visible_aliases(&self) -> Option<Vec<&str>> {
381219625d8cSopenharmony_ci        let mut longs = match self.get_long() {
381319625d8cSopenharmony_ci            Some(long) => vec![long],
381419625d8cSopenharmony_ci            None => return None,
381519625d8cSopenharmony_ci        };
381619625d8cSopenharmony_ci        if let Some(aliases) = self.get_visible_aliases() {
381719625d8cSopenharmony_ci            longs.extend(aliases);
381819625d8cSopenharmony_ci        }
381919625d8cSopenharmony_ci        Some(longs)
382019625d8cSopenharmony_ci    }
382119625d8cSopenharmony_ci
382219625d8cSopenharmony_ci    /// Get the names of possible values for this argument. Only useful for user
382319625d8cSopenharmony_ci    /// facing applications, such as building help messages or man files
382419625d8cSopenharmony_ci    pub fn get_possible_values(&self) -> Vec<PossibleValue> {
382519625d8cSopenharmony_ci        if !self.is_takes_value_set() {
382619625d8cSopenharmony_ci            vec![]
382719625d8cSopenharmony_ci        } else {
382819625d8cSopenharmony_ci            self.get_value_parser()
382919625d8cSopenharmony_ci                .possible_values()
383019625d8cSopenharmony_ci                .map(|pvs| pvs.collect())
383119625d8cSopenharmony_ci                .unwrap_or_default()
383219625d8cSopenharmony_ci        }
383319625d8cSopenharmony_ci    }
383419625d8cSopenharmony_ci
383519625d8cSopenharmony_ci    /// Get the names of values for this argument.
383619625d8cSopenharmony_ci    #[inline]
383719625d8cSopenharmony_ci    pub fn get_value_names(&self) -> Option<&[Str]> {
383819625d8cSopenharmony_ci        if self.val_names.is_empty() {
383919625d8cSopenharmony_ci            None
384019625d8cSopenharmony_ci        } else {
384119625d8cSopenharmony_ci            Some(&self.val_names)
384219625d8cSopenharmony_ci        }
384319625d8cSopenharmony_ci    }
384419625d8cSopenharmony_ci
384519625d8cSopenharmony_ci    /// Get the number of values for this argument.
384619625d8cSopenharmony_ci    #[inline]
384719625d8cSopenharmony_ci    pub fn get_num_args(&self) -> Option<ValueRange> {
384819625d8cSopenharmony_ci        self.num_vals
384919625d8cSopenharmony_ci    }
385019625d8cSopenharmony_ci
385119625d8cSopenharmony_ci    #[inline]
385219625d8cSopenharmony_ci    pub(crate) fn get_min_vals(&self) -> usize {
385319625d8cSopenharmony_ci        self.get_num_args().expect(INTERNAL_ERROR_MSG).min_values()
385419625d8cSopenharmony_ci    }
385519625d8cSopenharmony_ci
385619625d8cSopenharmony_ci    /// Get the delimiter between multiple values
385719625d8cSopenharmony_ci    #[inline]
385819625d8cSopenharmony_ci    pub fn get_value_delimiter(&self) -> Option<char> {
385919625d8cSopenharmony_ci        self.val_delim
386019625d8cSopenharmony_ci    }
386119625d8cSopenharmony_ci
386219625d8cSopenharmony_ci    /// Get the value terminator for this argument. The value_terminator is a value
386319625d8cSopenharmony_ci    /// that terminates parsing of multi-valued arguments.
386419625d8cSopenharmony_ci    #[inline]
386519625d8cSopenharmony_ci    pub fn get_value_terminator(&self) -> Option<&Str> {
386619625d8cSopenharmony_ci        self.terminator.as_ref()
386719625d8cSopenharmony_ci    }
386819625d8cSopenharmony_ci
386919625d8cSopenharmony_ci    /// Get the index of this argument, if any
387019625d8cSopenharmony_ci    #[inline]
387119625d8cSopenharmony_ci    pub fn get_index(&self) -> Option<usize> {
387219625d8cSopenharmony_ci        self.index
387319625d8cSopenharmony_ci    }
387419625d8cSopenharmony_ci
387519625d8cSopenharmony_ci    /// Get the value hint of this argument
387619625d8cSopenharmony_ci    pub fn get_value_hint(&self) -> ValueHint {
387719625d8cSopenharmony_ci        self.value_hint.unwrap_or_else(|| {
387819625d8cSopenharmony_ci            if self.is_takes_value_set() {
387919625d8cSopenharmony_ci                let type_id = self.get_value_parser().type_id();
388019625d8cSopenharmony_ci                if type_id == crate::parser::AnyValueId::of::<std::path::PathBuf>() {
388119625d8cSopenharmony_ci                    ValueHint::AnyPath
388219625d8cSopenharmony_ci                } else {
388319625d8cSopenharmony_ci                    ValueHint::default()
388419625d8cSopenharmony_ci                }
388519625d8cSopenharmony_ci            } else {
388619625d8cSopenharmony_ci                ValueHint::default()
388719625d8cSopenharmony_ci            }
388819625d8cSopenharmony_ci        })
388919625d8cSopenharmony_ci    }
389019625d8cSopenharmony_ci
389119625d8cSopenharmony_ci    /// Get the environment variable name specified for this argument, if any
389219625d8cSopenharmony_ci    ///
389319625d8cSopenharmony_ci    /// # Examples
389419625d8cSopenharmony_ci    ///
389519625d8cSopenharmony_ci    /// ```rust
389619625d8cSopenharmony_ci    /// # use std::ffi::OsStr;
389719625d8cSopenharmony_ci    /// # use clap::Arg;
389819625d8cSopenharmony_ci    /// let arg = Arg::new("foo").env("ENVIRONMENT");
389919625d8cSopenharmony_ci    /// assert_eq!(arg.get_env(), Some(OsStr::new("ENVIRONMENT")));
390019625d8cSopenharmony_ci    /// ```
390119625d8cSopenharmony_ci    #[cfg(feature = "env")]
390219625d8cSopenharmony_ci    pub fn get_env(&self) -> Option<&std::ffi::OsStr> {
390319625d8cSopenharmony_ci        self.env.as_ref().map(|x| x.0.as_os_str())
390419625d8cSopenharmony_ci    }
390519625d8cSopenharmony_ci
390619625d8cSopenharmony_ci    /// Get the default values specified for this argument, if any
390719625d8cSopenharmony_ci    ///
390819625d8cSopenharmony_ci    /// # Examples
390919625d8cSopenharmony_ci    ///
391019625d8cSopenharmony_ci    /// ```rust
391119625d8cSopenharmony_ci    /// # use clap::Arg;
391219625d8cSopenharmony_ci    /// let arg = Arg::new("foo").default_value("default value");
391319625d8cSopenharmony_ci    /// assert_eq!(arg.get_default_values(), &["default value"]);
391419625d8cSopenharmony_ci    /// ```
391519625d8cSopenharmony_ci    pub fn get_default_values(&self) -> &[OsStr] {
391619625d8cSopenharmony_ci        &self.default_vals
391719625d8cSopenharmony_ci    }
391819625d8cSopenharmony_ci
391919625d8cSopenharmony_ci    /// Checks whether this argument is a positional or not.
392019625d8cSopenharmony_ci    ///
392119625d8cSopenharmony_ci    /// # Examples
392219625d8cSopenharmony_ci    ///
392319625d8cSopenharmony_ci    /// ```
392419625d8cSopenharmony_ci    /// # use clap::Arg;
392519625d8cSopenharmony_ci    /// let arg = Arg::new("foo");
392619625d8cSopenharmony_ci    /// assert_eq!(arg.is_positional(), true);
392719625d8cSopenharmony_ci    ///
392819625d8cSopenharmony_ci    /// let arg = Arg::new("foo").long("foo");
392919625d8cSopenharmony_ci    /// assert_eq!(arg.is_positional(), false);
393019625d8cSopenharmony_ci    /// ```
393119625d8cSopenharmony_ci    pub fn is_positional(&self) -> bool {
393219625d8cSopenharmony_ci        self.get_long().is_none() && self.get_short().is_none()
393319625d8cSopenharmony_ci    }
393419625d8cSopenharmony_ci
393519625d8cSopenharmony_ci    /// Reports whether [`Arg::required`] is set
393619625d8cSopenharmony_ci    pub fn is_required_set(&self) -> bool {
393719625d8cSopenharmony_ci        self.is_set(ArgSettings::Required)
393819625d8cSopenharmony_ci    }
393919625d8cSopenharmony_ci
394019625d8cSopenharmony_ci    pub(crate) fn is_multiple_values_set(&self) -> bool {
394119625d8cSopenharmony_ci        self.get_num_args().unwrap_or_default().is_multiple()
394219625d8cSopenharmony_ci    }
394319625d8cSopenharmony_ci
394419625d8cSopenharmony_ci    pub(crate) fn is_takes_value_set(&self) -> bool {
394519625d8cSopenharmony_ci        self.get_action().takes_values()
394619625d8cSopenharmony_ci    }
394719625d8cSopenharmony_ci
394819625d8cSopenharmony_ci    /// Report whether [`Arg::allow_hyphen_values`] is set
394919625d8cSopenharmony_ci    pub fn is_allow_hyphen_values_set(&self) -> bool {
395019625d8cSopenharmony_ci        self.is_set(ArgSettings::AllowHyphenValues)
395119625d8cSopenharmony_ci    }
395219625d8cSopenharmony_ci
395319625d8cSopenharmony_ci    /// Report whether [`Arg::allow_negative_numbers`] is set
395419625d8cSopenharmony_ci    pub fn is_allow_negative_numbers_set(&self) -> bool {
395519625d8cSopenharmony_ci        self.is_set(ArgSettings::AllowNegativeNumbers)
395619625d8cSopenharmony_ci    }
395719625d8cSopenharmony_ci
395819625d8cSopenharmony_ci    /// Behavior when parsing the argument
395919625d8cSopenharmony_ci    pub fn get_action(&self) -> &super::ArgAction {
396019625d8cSopenharmony_ci        const DEFAULT: super::ArgAction = super::ArgAction::Set;
396119625d8cSopenharmony_ci        self.action.as_ref().unwrap_or(&DEFAULT)
396219625d8cSopenharmony_ci    }
396319625d8cSopenharmony_ci
396419625d8cSopenharmony_ci    /// Configured parser for argument values
396519625d8cSopenharmony_ci    ///
396619625d8cSopenharmony_ci    /// # Example
396719625d8cSopenharmony_ci    ///
396819625d8cSopenharmony_ci    /// ```rust
396919625d8cSopenharmony_ci    /// let cmd = clap::Command::new("raw")
397019625d8cSopenharmony_ci    ///     .arg(
397119625d8cSopenharmony_ci    ///         clap::Arg::new("port")
397219625d8cSopenharmony_ci    ///             .value_parser(clap::value_parser!(usize))
397319625d8cSopenharmony_ci    ///     );
397419625d8cSopenharmony_ci    /// let value_parser = cmd.get_arguments()
397519625d8cSopenharmony_ci    ///     .find(|a| a.get_id() == "port").unwrap()
397619625d8cSopenharmony_ci    ///     .get_value_parser();
397719625d8cSopenharmony_ci    /// println!("{:?}", value_parser);
397819625d8cSopenharmony_ci    /// ```
397919625d8cSopenharmony_ci    pub fn get_value_parser(&self) -> &super::ValueParser {
398019625d8cSopenharmony_ci        if let Some(value_parser) = self.value_parser.as_ref() {
398119625d8cSopenharmony_ci            value_parser
398219625d8cSopenharmony_ci        } else {
398319625d8cSopenharmony_ci            static DEFAULT: super::ValueParser = super::ValueParser::string();
398419625d8cSopenharmony_ci            &DEFAULT
398519625d8cSopenharmony_ci        }
398619625d8cSopenharmony_ci    }
398719625d8cSopenharmony_ci
398819625d8cSopenharmony_ci    /// Report whether [`Arg::global`] is set
398919625d8cSopenharmony_ci    pub fn is_global_set(&self) -> bool {
399019625d8cSopenharmony_ci        self.is_set(ArgSettings::Global)
399119625d8cSopenharmony_ci    }
399219625d8cSopenharmony_ci
399319625d8cSopenharmony_ci    /// Report whether [`Arg::next_line_help`] is set
399419625d8cSopenharmony_ci    pub fn is_next_line_help_set(&self) -> bool {
399519625d8cSopenharmony_ci        self.is_set(ArgSettings::NextLineHelp)
399619625d8cSopenharmony_ci    }
399719625d8cSopenharmony_ci
399819625d8cSopenharmony_ci    /// Report whether [`Arg::hide`] is set
399919625d8cSopenharmony_ci    pub fn is_hide_set(&self) -> bool {
400019625d8cSopenharmony_ci        self.is_set(ArgSettings::Hidden)
400119625d8cSopenharmony_ci    }
400219625d8cSopenharmony_ci
400319625d8cSopenharmony_ci    /// Report whether [`Arg::hide_default_value`] is set
400419625d8cSopenharmony_ci    pub fn is_hide_default_value_set(&self) -> bool {
400519625d8cSopenharmony_ci        self.is_set(ArgSettings::HideDefaultValue)
400619625d8cSopenharmony_ci    }
400719625d8cSopenharmony_ci
400819625d8cSopenharmony_ci    /// Report whether [`Arg::hide_possible_values`] is set
400919625d8cSopenharmony_ci    pub fn is_hide_possible_values_set(&self) -> bool {
401019625d8cSopenharmony_ci        self.is_set(ArgSettings::HidePossibleValues)
401119625d8cSopenharmony_ci    }
401219625d8cSopenharmony_ci
401319625d8cSopenharmony_ci    /// Report whether [`Arg::hide_env`] is set
401419625d8cSopenharmony_ci    #[cfg(feature = "env")]
401519625d8cSopenharmony_ci    pub fn is_hide_env_set(&self) -> bool {
401619625d8cSopenharmony_ci        self.is_set(ArgSettings::HideEnv)
401719625d8cSopenharmony_ci    }
401819625d8cSopenharmony_ci
401919625d8cSopenharmony_ci    /// Report whether [`Arg::hide_env_values`] is set
402019625d8cSopenharmony_ci    #[cfg(feature = "env")]
402119625d8cSopenharmony_ci    pub fn is_hide_env_values_set(&self) -> bool {
402219625d8cSopenharmony_ci        self.is_set(ArgSettings::HideEnvValues)
402319625d8cSopenharmony_ci    }
402419625d8cSopenharmony_ci
402519625d8cSopenharmony_ci    /// Report whether [`Arg::hide_short_help`] is set
402619625d8cSopenharmony_ci    pub fn is_hide_short_help_set(&self) -> bool {
402719625d8cSopenharmony_ci        self.is_set(ArgSettings::HiddenShortHelp)
402819625d8cSopenharmony_ci    }
402919625d8cSopenharmony_ci
403019625d8cSopenharmony_ci    /// Report whether [`Arg::hide_long_help`] is set
403119625d8cSopenharmony_ci    pub fn is_hide_long_help_set(&self) -> bool {
403219625d8cSopenharmony_ci        self.is_set(ArgSettings::HiddenLongHelp)
403319625d8cSopenharmony_ci    }
403419625d8cSopenharmony_ci
403519625d8cSopenharmony_ci    /// Report whether [`Arg::require_equals`] is set
403619625d8cSopenharmony_ci    pub fn is_require_equals_set(&self) -> bool {
403719625d8cSopenharmony_ci        self.is_set(ArgSettings::RequireEquals)
403819625d8cSopenharmony_ci    }
403919625d8cSopenharmony_ci
404019625d8cSopenharmony_ci    /// Reports whether [`Arg::exclusive`] is set
404119625d8cSopenharmony_ci    pub fn is_exclusive_set(&self) -> bool {
404219625d8cSopenharmony_ci        self.is_set(ArgSettings::Exclusive)
404319625d8cSopenharmony_ci    }
404419625d8cSopenharmony_ci
404519625d8cSopenharmony_ci    /// Report whether [`Arg::trailing_var_arg`] is set
404619625d8cSopenharmony_ci    pub fn is_trailing_var_arg_set(&self) -> bool {
404719625d8cSopenharmony_ci        self.is_set(ArgSettings::TrailingVarArg)
404819625d8cSopenharmony_ci    }
404919625d8cSopenharmony_ci
405019625d8cSopenharmony_ci    /// Reports whether [`Arg::last`] is set
405119625d8cSopenharmony_ci    pub fn is_last_set(&self) -> bool {
405219625d8cSopenharmony_ci        self.is_set(ArgSettings::Last)
405319625d8cSopenharmony_ci    }
405419625d8cSopenharmony_ci
405519625d8cSopenharmony_ci    /// Reports whether [`Arg::ignore_case`] is set
405619625d8cSopenharmony_ci    pub fn is_ignore_case_set(&self) -> bool {
405719625d8cSopenharmony_ci        self.is_set(ArgSettings::IgnoreCase)
405819625d8cSopenharmony_ci    }
405919625d8cSopenharmony_ci}
406019625d8cSopenharmony_ci
406119625d8cSopenharmony_ci/// # Internally used only
406219625d8cSopenharmony_ciimpl Arg {
406319625d8cSopenharmony_ci    pub(crate) fn _build(&mut self) {
406419625d8cSopenharmony_ci        if self.action.is_none() {
406519625d8cSopenharmony_ci            if self.num_vals == Some(ValueRange::EMPTY) {
406619625d8cSopenharmony_ci                let action = super::ArgAction::SetTrue;
406719625d8cSopenharmony_ci                self.action = Some(action);
406819625d8cSopenharmony_ci            } else {
406919625d8cSopenharmony_ci                let action =
407019625d8cSopenharmony_ci                    if self.is_positional() && self.num_vals.unwrap_or_default().is_unbounded() {
407119625d8cSopenharmony_ci                        // Allow collecting arguments interleaved with flags
407219625d8cSopenharmony_ci                        //
407319625d8cSopenharmony_ci                        // Bounded values are probably a group and the user should explicitly opt-in to
407419625d8cSopenharmony_ci                        // Append
407519625d8cSopenharmony_ci                        super::ArgAction::Append
407619625d8cSopenharmony_ci                    } else {
407719625d8cSopenharmony_ci                        super::ArgAction::Set
407819625d8cSopenharmony_ci                    };
407919625d8cSopenharmony_ci                self.action = Some(action);
408019625d8cSopenharmony_ci            }
408119625d8cSopenharmony_ci        }
408219625d8cSopenharmony_ci        if let Some(action) = self.action.as_ref() {
408319625d8cSopenharmony_ci            if let Some(default_value) = action.default_value() {
408419625d8cSopenharmony_ci                if self.default_vals.is_empty() {
408519625d8cSopenharmony_ci                    self.default_vals = vec![default_value.into()];
408619625d8cSopenharmony_ci                }
408719625d8cSopenharmony_ci            }
408819625d8cSopenharmony_ci            if let Some(default_value) = action.default_missing_value() {
408919625d8cSopenharmony_ci                if self.default_missing_vals.is_empty() {
409019625d8cSopenharmony_ci                    self.default_missing_vals = vec![default_value.into()];
409119625d8cSopenharmony_ci                }
409219625d8cSopenharmony_ci            }
409319625d8cSopenharmony_ci        }
409419625d8cSopenharmony_ci
409519625d8cSopenharmony_ci        if self.value_parser.is_none() {
409619625d8cSopenharmony_ci            if let Some(default) = self.action.as_ref().and_then(|a| a.default_value_parser()) {
409719625d8cSopenharmony_ci                self.value_parser = Some(default);
409819625d8cSopenharmony_ci            } else {
409919625d8cSopenharmony_ci                self.value_parser = Some(super::ValueParser::string());
410019625d8cSopenharmony_ci            }
410119625d8cSopenharmony_ci        }
410219625d8cSopenharmony_ci
410319625d8cSopenharmony_ci        let val_names_len = self.val_names.len();
410419625d8cSopenharmony_ci        if val_names_len > 1 {
410519625d8cSopenharmony_ci            self.num_vals.get_or_insert(val_names_len.into());
410619625d8cSopenharmony_ci        } else {
410719625d8cSopenharmony_ci            let nargs = if self.get_action().takes_values() {
410819625d8cSopenharmony_ci                ValueRange::SINGLE
410919625d8cSopenharmony_ci            } else {
411019625d8cSopenharmony_ci                ValueRange::EMPTY
411119625d8cSopenharmony_ci            };
411219625d8cSopenharmony_ci            self.num_vals.get_or_insert(nargs);
411319625d8cSopenharmony_ci        }
411419625d8cSopenharmony_ci    }
411519625d8cSopenharmony_ci
411619625d8cSopenharmony_ci    // Used for positionals when printing
411719625d8cSopenharmony_ci    pub(crate) fn name_no_brackets(&self) -> String {
411819625d8cSopenharmony_ci        debug!("Arg::name_no_brackets:{}", self.get_id());
411919625d8cSopenharmony_ci        let delim = " ";
412019625d8cSopenharmony_ci        if !self.val_names.is_empty() {
412119625d8cSopenharmony_ci            debug!("Arg::name_no_brackets: val_names={:#?}", self.val_names);
412219625d8cSopenharmony_ci
412319625d8cSopenharmony_ci            if self.val_names.len() > 1 {
412419625d8cSopenharmony_ci                self.val_names
412519625d8cSopenharmony_ci                    .iter()
412619625d8cSopenharmony_ci                    .map(|n| format!("<{n}>"))
412719625d8cSopenharmony_ci                    .collect::<Vec<_>>()
412819625d8cSopenharmony_ci                    .join(delim)
412919625d8cSopenharmony_ci            } else {
413019625d8cSopenharmony_ci                self.val_names
413119625d8cSopenharmony_ci                    .first()
413219625d8cSopenharmony_ci                    .expect(INTERNAL_ERROR_MSG)
413319625d8cSopenharmony_ci                    .as_str()
413419625d8cSopenharmony_ci                    .to_owned()
413519625d8cSopenharmony_ci            }
413619625d8cSopenharmony_ci        } else {
413719625d8cSopenharmony_ci            debug!("Arg::name_no_brackets: just name");
413819625d8cSopenharmony_ci            self.get_id().as_str().to_owned()
413919625d8cSopenharmony_ci        }
414019625d8cSopenharmony_ci    }
414119625d8cSopenharmony_ci
414219625d8cSopenharmony_ci    pub(crate) fn stylized(&self, required: Option<bool>) -> StyledStr {
414319625d8cSopenharmony_ci        let mut styled = StyledStr::new();
414419625d8cSopenharmony_ci        // Write the name such --long or -l
414519625d8cSopenharmony_ci        if let Some(l) = self.get_long() {
414619625d8cSopenharmony_ci            styled.literal("--");
414719625d8cSopenharmony_ci            styled.literal(l);
414819625d8cSopenharmony_ci        } else if let Some(s) = self.get_short() {
414919625d8cSopenharmony_ci            styled.literal("-");
415019625d8cSopenharmony_ci            styled.literal(s);
415119625d8cSopenharmony_ci        }
415219625d8cSopenharmony_ci        styled.extend(self.stylize_arg_suffix(required).into_iter());
415319625d8cSopenharmony_ci        styled
415419625d8cSopenharmony_ci    }
415519625d8cSopenharmony_ci
415619625d8cSopenharmony_ci    pub(crate) fn stylize_arg_suffix(&self, required: Option<bool>) -> StyledStr {
415719625d8cSopenharmony_ci        let mut styled = StyledStr::new();
415819625d8cSopenharmony_ci
415919625d8cSopenharmony_ci        let mut need_closing_bracket = false;
416019625d8cSopenharmony_ci        if self.is_takes_value_set() && !self.is_positional() {
416119625d8cSopenharmony_ci            let is_optional_val = self.get_min_vals() == 0;
416219625d8cSopenharmony_ci            if self.is_require_equals_set() {
416319625d8cSopenharmony_ci                if is_optional_val {
416419625d8cSopenharmony_ci                    need_closing_bracket = true;
416519625d8cSopenharmony_ci                    styled.placeholder("[=");
416619625d8cSopenharmony_ci                } else {
416719625d8cSopenharmony_ci                    styled.literal("=");
416819625d8cSopenharmony_ci                }
416919625d8cSopenharmony_ci            } else if is_optional_val {
417019625d8cSopenharmony_ci                need_closing_bracket = true;
417119625d8cSopenharmony_ci                styled.placeholder(" [");
417219625d8cSopenharmony_ci            } else {
417319625d8cSopenharmony_ci                styled.placeholder(" ");
417419625d8cSopenharmony_ci            }
417519625d8cSopenharmony_ci        }
417619625d8cSopenharmony_ci        if self.is_takes_value_set() || self.is_positional() {
417719625d8cSopenharmony_ci            let required = required.unwrap_or_else(|| self.is_required_set());
417819625d8cSopenharmony_ci            let arg_val = self.render_arg_val(required);
417919625d8cSopenharmony_ci            styled.placeholder(arg_val);
418019625d8cSopenharmony_ci        } else if matches!(*self.get_action(), ArgAction::Count) {
418119625d8cSopenharmony_ci            styled.placeholder("...");
418219625d8cSopenharmony_ci        }
418319625d8cSopenharmony_ci        if need_closing_bracket {
418419625d8cSopenharmony_ci            styled.placeholder("]");
418519625d8cSopenharmony_ci        }
418619625d8cSopenharmony_ci
418719625d8cSopenharmony_ci        styled
418819625d8cSopenharmony_ci    }
418919625d8cSopenharmony_ci
419019625d8cSopenharmony_ci    /// Write the values such as `<name1> <name2>`
419119625d8cSopenharmony_ci    fn render_arg_val(&self, required: bool) -> String {
419219625d8cSopenharmony_ci        let mut rendered = String::new();
419319625d8cSopenharmony_ci
419419625d8cSopenharmony_ci        let num_vals = self.get_num_args().unwrap_or_else(|| 1.into());
419519625d8cSopenharmony_ci
419619625d8cSopenharmony_ci        let mut val_names = if self.val_names.is_empty() {
419719625d8cSopenharmony_ci            vec![self.id.as_internal_str().to_owned()]
419819625d8cSopenharmony_ci        } else {
419919625d8cSopenharmony_ci            self.val_names.clone()
420019625d8cSopenharmony_ci        };
420119625d8cSopenharmony_ci        if val_names.len() == 1 {
420219625d8cSopenharmony_ci            let min = num_vals.min_values().max(1);
420319625d8cSopenharmony_ci            let val_name = val_names.pop().unwrap();
420419625d8cSopenharmony_ci            val_names = vec![val_name; min];
420519625d8cSopenharmony_ci        }
420619625d8cSopenharmony_ci
420719625d8cSopenharmony_ci        debug_assert!(self.is_takes_value_set());
420819625d8cSopenharmony_ci        for (n, val_name) in val_names.iter().enumerate() {
420919625d8cSopenharmony_ci            let arg_name = if self.is_positional() && (num_vals.min_values() == 0 || !required) {
421019625d8cSopenharmony_ci                format!("[{val_name}]")
421119625d8cSopenharmony_ci            } else {
421219625d8cSopenharmony_ci                format!("<{val_name}>")
421319625d8cSopenharmony_ci            };
421419625d8cSopenharmony_ci
421519625d8cSopenharmony_ci            if n != 0 {
421619625d8cSopenharmony_ci                rendered.push(' ');
421719625d8cSopenharmony_ci            }
421819625d8cSopenharmony_ci            rendered.push_str(&arg_name);
421919625d8cSopenharmony_ci        }
422019625d8cSopenharmony_ci
422119625d8cSopenharmony_ci        let mut extra_values = false;
422219625d8cSopenharmony_ci        extra_values |= val_names.len() < num_vals.max_values();
422319625d8cSopenharmony_ci        if self.is_positional() && matches!(*self.get_action(), ArgAction::Append) {
422419625d8cSopenharmony_ci            extra_values = true;
422519625d8cSopenharmony_ci        }
422619625d8cSopenharmony_ci        if extra_values {
422719625d8cSopenharmony_ci            rendered.push_str("...");
422819625d8cSopenharmony_ci        }
422919625d8cSopenharmony_ci
423019625d8cSopenharmony_ci        rendered
423119625d8cSopenharmony_ci    }
423219625d8cSopenharmony_ci
423319625d8cSopenharmony_ci    /// Either multiple values or occurrences
423419625d8cSopenharmony_ci    pub(crate) fn is_multiple(&self) -> bool {
423519625d8cSopenharmony_ci        self.is_multiple_values_set() || matches!(*self.get_action(), ArgAction::Append)
423619625d8cSopenharmony_ci    }
423719625d8cSopenharmony_ci
423819625d8cSopenharmony_ci    #[cfg(feature = "help")]
423919625d8cSopenharmony_ci    pub(crate) fn get_display_order(&self) -> usize {
424019625d8cSopenharmony_ci        self.disp_ord.unwrap_or(999)
424119625d8cSopenharmony_ci    }
424219625d8cSopenharmony_ci}
424319625d8cSopenharmony_ci
424419625d8cSopenharmony_ciimpl From<&'_ Arg> for Arg {
424519625d8cSopenharmony_ci    fn from(a: &Arg) -> Self {
424619625d8cSopenharmony_ci        a.clone()
424719625d8cSopenharmony_ci    }
424819625d8cSopenharmony_ci}
424919625d8cSopenharmony_ci
425019625d8cSopenharmony_ciimpl PartialEq for Arg {
425119625d8cSopenharmony_ci    fn eq(&self, other: &Arg) -> bool {
425219625d8cSopenharmony_ci        self.get_id() == other.get_id()
425319625d8cSopenharmony_ci    }
425419625d8cSopenharmony_ci}
425519625d8cSopenharmony_ci
425619625d8cSopenharmony_ciimpl PartialOrd for Arg {
425719625d8cSopenharmony_ci    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
425819625d8cSopenharmony_ci        Some(self.cmp(other))
425919625d8cSopenharmony_ci    }
426019625d8cSopenharmony_ci}
426119625d8cSopenharmony_ci
426219625d8cSopenharmony_ciimpl Ord for Arg {
426319625d8cSopenharmony_ci    fn cmp(&self, other: &Arg) -> Ordering {
426419625d8cSopenharmony_ci        self.get_id().cmp(other.get_id())
426519625d8cSopenharmony_ci    }
426619625d8cSopenharmony_ci}
426719625d8cSopenharmony_ci
426819625d8cSopenharmony_ciimpl Eq for Arg {}
426919625d8cSopenharmony_ci
427019625d8cSopenharmony_ciimpl Display for Arg {
427119625d8cSopenharmony_ci    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
427219625d8cSopenharmony_ci        self.stylized(None).fmt(f)
427319625d8cSopenharmony_ci    }
427419625d8cSopenharmony_ci}
427519625d8cSopenharmony_ci
427619625d8cSopenharmony_ciimpl fmt::Debug for Arg {
427719625d8cSopenharmony_ci    fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
427819625d8cSopenharmony_ci        let mut ds = f.debug_struct("Arg");
427919625d8cSopenharmony_ci
428019625d8cSopenharmony_ci        #[allow(unused_mut)]
428119625d8cSopenharmony_ci        let mut ds = ds
428219625d8cSopenharmony_ci            .field("id", &self.id)
428319625d8cSopenharmony_ci            .field("help", &self.help)
428419625d8cSopenharmony_ci            .field("long_help", &self.long_help)
428519625d8cSopenharmony_ci            .field("action", &self.action)
428619625d8cSopenharmony_ci            .field("value_parser", &self.value_parser)
428719625d8cSopenharmony_ci            .field("blacklist", &self.blacklist)
428819625d8cSopenharmony_ci            .field("settings", &self.settings)
428919625d8cSopenharmony_ci            .field("overrides", &self.overrides)
429019625d8cSopenharmony_ci            .field("groups", &self.groups)
429119625d8cSopenharmony_ci            .field("requires", &self.requires)
429219625d8cSopenharmony_ci            .field("r_ifs", &self.r_ifs)
429319625d8cSopenharmony_ci            .field("r_unless", &self.r_unless)
429419625d8cSopenharmony_ci            .field("short", &self.short)
429519625d8cSopenharmony_ci            .field("long", &self.long)
429619625d8cSopenharmony_ci            .field("aliases", &self.aliases)
429719625d8cSopenharmony_ci            .field("short_aliases", &self.short_aliases)
429819625d8cSopenharmony_ci            .field("disp_ord", &self.disp_ord)
429919625d8cSopenharmony_ci            .field("val_names", &self.val_names)
430019625d8cSopenharmony_ci            .field("num_vals", &self.num_vals)
430119625d8cSopenharmony_ci            .field("val_delim", &self.val_delim)
430219625d8cSopenharmony_ci            .field("default_vals", &self.default_vals)
430319625d8cSopenharmony_ci            .field("default_vals_ifs", &self.default_vals_ifs)
430419625d8cSopenharmony_ci            .field("terminator", &self.terminator)
430519625d8cSopenharmony_ci            .field("index", &self.index)
430619625d8cSopenharmony_ci            .field("help_heading", &self.help_heading)
430719625d8cSopenharmony_ci            .field("value_hint", &self.value_hint)
430819625d8cSopenharmony_ci            .field("default_missing_vals", &self.default_missing_vals);
430919625d8cSopenharmony_ci
431019625d8cSopenharmony_ci        #[cfg(feature = "env")]
431119625d8cSopenharmony_ci        {
431219625d8cSopenharmony_ci            ds = ds.field("env", &self.env);
431319625d8cSopenharmony_ci        }
431419625d8cSopenharmony_ci
431519625d8cSopenharmony_ci        ds.finish()
431619625d8cSopenharmony_ci    }
431719625d8cSopenharmony_ci}
431819625d8cSopenharmony_ci
431919625d8cSopenharmony_ci// Flags
432019625d8cSopenharmony_ci#[cfg(test)]
432119625d8cSopenharmony_cimod test {
432219625d8cSopenharmony_ci    use super::Arg;
432319625d8cSopenharmony_ci    use super::ArgAction;
432419625d8cSopenharmony_ci
432519625d8cSopenharmony_ci    #[test]
432619625d8cSopenharmony_ci    fn flag_display_long() {
432719625d8cSopenharmony_ci        let mut f = Arg::new("flg").long("flag").action(ArgAction::SetTrue);
432819625d8cSopenharmony_ci        f._build();
432919625d8cSopenharmony_ci
433019625d8cSopenharmony_ci        assert_eq!(f.to_string(), "--flag");
433119625d8cSopenharmony_ci    }
433219625d8cSopenharmony_ci
433319625d8cSopenharmony_ci    #[test]
433419625d8cSopenharmony_ci    fn flag_display_short() {
433519625d8cSopenharmony_ci        let mut f2 = Arg::new("flg").short('f').action(ArgAction::SetTrue);
433619625d8cSopenharmony_ci        f2._build();
433719625d8cSopenharmony_ci
433819625d8cSopenharmony_ci        assert_eq!(f2.to_string(), "-f");
433919625d8cSopenharmony_ci    }
434019625d8cSopenharmony_ci
434119625d8cSopenharmony_ci    #[test]
434219625d8cSopenharmony_ci    fn flag_display_count() {
434319625d8cSopenharmony_ci        let mut f2 = Arg::new("flg").long("flag").action(ArgAction::Count);
434419625d8cSopenharmony_ci        f2._build();
434519625d8cSopenharmony_ci
434619625d8cSopenharmony_ci        assert_eq!(f2.to_string(), "--flag...");
434719625d8cSopenharmony_ci    }
434819625d8cSopenharmony_ci
434919625d8cSopenharmony_ci    #[test]
435019625d8cSopenharmony_ci    fn flag_display_single_alias() {
435119625d8cSopenharmony_ci        let mut f = Arg::new("flg")
435219625d8cSopenharmony_ci            .long("flag")
435319625d8cSopenharmony_ci            .visible_alias("als")
435419625d8cSopenharmony_ci            .action(ArgAction::SetTrue);
435519625d8cSopenharmony_ci        f._build();
435619625d8cSopenharmony_ci
435719625d8cSopenharmony_ci        assert_eq!(f.to_string(), "--flag")
435819625d8cSopenharmony_ci    }
435919625d8cSopenharmony_ci
436019625d8cSopenharmony_ci    #[test]
436119625d8cSopenharmony_ci    fn flag_display_multiple_aliases() {
436219625d8cSopenharmony_ci        let mut f = Arg::new("flg").short('f').action(ArgAction::SetTrue);
436319625d8cSopenharmony_ci        f.aliases = vec![
436419625d8cSopenharmony_ci            ("alias_not_visible".into(), false),
436519625d8cSopenharmony_ci            ("f2".into(), true),
436619625d8cSopenharmony_ci            ("f3".into(), true),
436719625d8cSopenharmony_ci            ("f4".into(), true),
436819625d8cSopenharmony_ci        ];
436919625d8cSopenharmony_ci        f._build();
437019625d8cSopenharmony_ci
437119625d8cSopenharmony_ci        assert_eq!(f.to_string(), "-f");
437219625d8cSopenharmony_ci    }
437319625d8cSopenharmony_ci
437419625d8cSopenharmony_ci    #[test]
437519625d8cSopenharmony_ci    fn flag_display_single_short_alias() {
437619625d8cSopenharmony_ci        let mut f = Arg::new("flg").short('a').action(ArgAction::SetTrue);
437719625d8cSopenharmony_ci        f.short_aliases = vec![('b', true)];
437819625d8cSopenharmony_ci        f._build();
437919625d8cSopenharmony_ci
438019625d8cSopenharmony_ci        assert_eq!(f.to_string(), "-a")
438119625d8cSopenharmony_ci    }
438219625d8cSopenharmony_ci
438319625d8cSopenharmony_ci    #[test]
438419625d8cSopenharmony_ci    fn flag_display_multiple_short_aliases() {
438519625d8cSopenharmony_ci        let mut f = Arg::new("flg").short('a').action(ArgAction::SetTrue);
438619625d8cSopenharmony_ci        f.short_aliases = vec![('b', false), ('c', true), ('d', true), ('e', true)];
438719625d8cSopenharmony_ci        f._build();
438819625d8cSopenharmony_ci
438919625d8cSopenharmony_ci        assert_eq!(f.to_string(), "-a");
439019625d8cSopenharmony_ci    }
439119625d8cSopenharmony_ci
439219625d8cSopenharmony_ci    // Options
439319625d8cSopenharmony_ci
439419625d8cSopenharmony_ci    #[test]
439519625d8cSopenharmony_ci    fn option_display_multiple_occurrences() {
439619625d8cSopenharmony_ci        let mut o = Arg::new("opt").long("option").action(ArgAction::Append);
439719625d8cSopenharmony_ci        o._build();
439819625d8cSopenharmony_ci
439919625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option <opt>");
440019625d8cSopenharmony_ci    }
440119625d8cSopenharmony_ci
440219625d8cSopenharmony_ci    #[test]
440319625d8cSopenharmony_ci    fn option_display_multiple_values() {
440419625d8cSopenharmony_ci        let mut o = Arg::new("opt")
440519625d8cSopenharmony_ci            .long("option")
440619625d8cSopenharmony_ci            .action(ArgAction::Set)
440719625d8cSopenharmony_ci            .num_args(1..);
440819625d8cSopenharmony_ci        o._build();
440919625d8cSopenharmony_ci
441019625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option <opt>...");
441119625d8cSopenharmony_ci    }
441219625d8cSopenharmony_ci
441319625d8cSopenharmony_ci    #[test]
441419625d8cSopenharmony_ci    fn option_display_zero_or_more_values() {
441519625d8cSopenharmony_ci        let mut o = Arg::new("opt")
441619625d8cSopenharmony_ci            .long("option")
441719625d8cSopenharmony_ci            .action(ArgAction::Set)
441819625d8cSopenharmony_ci            .num_args(0..);
441919625d8cSopenharmony_ci        o._build();
442019625d8cSopenharmony_ci
442119625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option [<opt>...]");
442219625d8cSopenharmony_ci    }
442319625d8cSopenharmony_ci
442419625d8cSopenharmony_ci    #[test]
442519625d8cSopenharmony_ci    fn option_display_one_or_more_values() {
442619625d8cSopenharmony_ci        let mut o = Arg::new("opt")
442719625d8cSopenharmony_ci            .long("option")
442819625d8cSopenharmony_ci            .action(ArgAction::Set)
442919625d8cSopenharmony_ci            .num_args(1..);
443019625d8cSopenharmony_ci        o._build();
443119625d8cSopenharmony_ci
443219625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option <opt>...");
443319625d8cSopenharmony_ci    }
443419625d8cSopenharmony_ci
443519625d8cSopenharmony_ci    #[test]
443619625d8cSopenharmony_ci    fn option_display_zero_or_more_values_with_value_name() {
443719625d8cSopenharmony_ci        let mut o = Arg::new("opt")
443819625d8cSopenharmony_ci            .short('o')
443919625d8cSopenharmony_ci            .action(ArgAction::Set)
444019625d8cSopenharmony_ci            .num_args(0..)
444119625d8cSopenharmony_ci            .value_names(["file"]);
444219625d8cSopenharmony_ci        o._build();
444319625d8cSopenharmony_ci
444419625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-o [<file>...]");
444519625d8cSopenharmony_ci    }
444619625d8cSopenharmony_ci
444719625d8cSopenharmony_ci    #[test]
444819625d8cSopenharmony_ci    fn option_display_one_or_more_values_with_value_name() {
444919625d8cSopenharmony_ci        let mut o = Arg::new("opt")
445019625d8cSopenharmony_ci            .short('o')
445119625d8cSopenharmony_ci            .action(ArgAction::Set)
445219625d8cSopenharmony_ci            .num_args(1..)
445319625d8cSopenharmony_ci            .value_names(["file"]);
445419625d8cSopenharmony_ci        o._build();
445519625d8cSopenharmony_ci
445619625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-o <file>...");
445719625d8cSopenharmony_ci    }
445819625d8cSopenharmony_ci
445919625d8cSopenharmony_ci    #[test]
446019625d8cSopenharmony_ci    fn option_display_optional_value() {
446119625d8cSopenharmony_ci        let mut o = Arg::new("opt")
446219625d8cSopenharmony_ci            .long("option")
446319625d8cSopenharmony_ci            .action(ArgAction::Set)
446419625d8cSopenharmony_ci            .num_args(0..=1);
446519625d8cSopenharmony_ci        o._build();
446619625d8cSopenharmony_ci
446719625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option [<opt>]");
446819625d8cSopenharmony_ci    }
446919625d8cSopenharmony_ci
447019625d8cSopenharmony_ci    #[test]
447119625d8cSopenharmony_ci    fn option_display_value_names() {
447219625d8cSopenharmony_ci        let mut o = Arg::new("opt")
447319625d8cSopenharmony_ci            .short('o')
447419625d8cSopenharmony_ci            .action(ArgAction::Set)
447519625d8cSopenharmony_ci            .value_names(["file", "name"]);
447619625d8cSopenharmony_ci        o._build();
447719625d8cSopenharmony_ci
447819625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-o <file> <name>");
447919625d8cSopenharmony_ci    }
448019625d8cSopenharmony_ci
448119625d8cSopenharmony_ci    #[test]
448219625d8cSopenharmony_ci    fn option_display3() {
448319625d8cSopenharmony_ci        let mut o = Arg::new("opt")
448419625d8cSopenharmony_ci            .short('o')
448519625d8cSopenharmony_ci            .num_args(1..)
448619625d8cSopenharmony_ci            .action(ArgAction::Set)
448719625d8cSopenharmony_ci            .value_names(["file", "name"]);
448819625d8cSopenharmony_ci        o._build();
448919625d8cSopenharmony_ci
449019625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-o <file> <name>...");
449119625d8cSopenharmony_ci    }
449219625d8cSopenharmony_ci
449319625d8cSopenharmony_ci    #[test]
449419625d8cSopenharmony_ci    fn option_display_single_alias() {
449519625d8cSopenharmony_ci        let mut o = Arg::new("opt")
449619625d8cSopenharmony_ci            .long("option")
449719625d8cSopenharmony_ci            .action(ArgAction::Set)
449819625d8cSopenharmony_ci            .visible_alias("als");
449919625d8cSopenharmony_ci        o._build();
450019625d8cSopenharmony_ci
450119625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option <opt>");
450219625d8cSopenharmony_ci    }
450319625d8cSopenharmony_ci
450419625d8cSopenharmony_ci    #[test]
450519625d8cSopenharmony_ci    fn option_display_multiple_aliases() {
450619625d8cSopenharmony_ci        let mut o = Arg::new("opt")
450719625d8cSopenharmony_ci            .long("option")
450819625d8cSopenharmony_ci            .action(ArgAction::Set)
450919625d8cSopenharmony_ci            .visible_aliases(["als2", "als3", "als4"])
451019625d8cSopenharmony_ci            .alias("als_not_visible");
451119625d8cSopenharmony_ci        o._build();
451219625d8cSopenharmony_ci
451319625d8cSopenharmony_ci        assert_eq!(o.to_string(), "--option <opt>");
451419625d8cSopenharmony_ci    }
451519625d8cSopenharmony_ci
451619625d8cSopenharmony_ci    #[test]
451719625d8cSopenharmony_ci    fn option_display_single_short_alias() {
451819625d8cSopenharmony_ci        let mut o = Arg::new("opt")
451919625d8cSopenharmony_ci            .short('a')
452019625d8cSopenharmony_ci            .action(ArgAction::Set)
452119625d8cSopenharmony_ci            .visible_short_alias('b');
452219625d8cSopenharmony_ci        o._build();
452319625d8cSopenharmony_ci
452419625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-a <opt>");
452519625d8cSopenharmony_ci    }
452619625d8cSopenharmony_ci
452719625d8cSopenharmony_ci    #[test]
452819625d8cSopenharmony_ci    fn option_display_multiple_short_aliases() {
452919625d8cSopenharmony_ci        let mut o = Arg::new("opt")
453019625d8cSopenharmony_ci            .short('a')
453119625d8cSopenharmony_ci            .action(ArgAction::Set)
453219625d8cSopenharmony_ci            .visible_short_aliases(['b', 'c', 'd'])
453319625d8cSopenharmony_ci            .short_alias('e');
453419625d8cSopenharmony_ci        o._build();
453519625d8cSopenharmony_ci
453619625d8cSopenharmony_ci        assert_eq!(o.to_string(), "-a <opt>");
453719625d8cSopenharmony_ci    }
453819625d8cSopenharmony_ci
453919625d8cSopenharmony_ci    // Positionals
454019625d8cSopenharmony_ci
454119625d8cSopenharmony_ci    #[test]
454219625d8cSopenharmony_ci    fn positional_display_multiple_values() {
454319625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).num_args(1..);
454419625d8cSopenharmony_ci        p._build();
454519625d8cSopenharmony_ci
454619625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[pos]...");
454719625d8cSopenharmony_ci    }
454819625d8cSopenharmony_ci
454919625d8cSopenharmony_ci    #[test]
455019625d8cSopenharmony_ci    fn positional_display_multiple_values_required() {
455119625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).num_args(1..).required(true);
455219625d8cSopenharmony_ci        p._build();
455319625d8cSopenharmony_ci
455419625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<pos>...");
455519625d8cSopenharmony_ci    }
455619625d8cSopenharmony_ci
455719625d8cSopenharmony_ci    #[test]
455819625d8cSopenharmony_ci    fn positional_display_zero_or_more_values() {
455919625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).num_args(0..);
456019625d8cSopenharmony_ci        p._build();
456119625d8cSopenharmony_ci
456219625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[pos]...");
456319625d8cSopenharmony_ci    }
456419625d8cSopenharmony_ci
456519625d8cSopenharmony_ci    #[test]
456619625d8cSopenharmony_ci    fn positional_display_one_or_more_values() {
456719625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).num_args(1..);
456819625d8cSopenharmony_ci        p._build();
456919625d8cSopenharmony_ci
457019625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[pos]...");
457119625d8cSopenharmony_ci    }
457219625d8cSopenharmony_ci
457319625d8cSopenharmony_ci    #[test]
457419625d8cSopenharmony_ci    fn positional_display_one_or_more_values_required() {
457519625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).num_args(1..).required(true);
457619625d8cSopenharmony_ci        p._build();
457719625d8cSopenharmony_ci
457819625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<pos>...");
457919625d8cSopenharmony_ci    }
458019625d8cSopenharmony_ci
458119625d8cSopenharmony_ci    #[test]
458219625d8cSopenharmony_ci    fn positional_display_optional_value() {
458319625d8cSopenharmony_ci        let mut p = Arg::new("pos")
458419625d8cSopenharmony_ci            .index(1)
458519625d8cSopenharmony_ci            .num_args(0..=1)
458619625d8cSopenharmony_ci            .action(ArgAction::Set);
458719625d8cSopenharmony_ci        p._build();
458819625d8cSopenharmony_ci
458919625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[pos]");
459019625d8cSopenharmony_ci    }
459119625d8cSopenharmony_ci
459219625d8cSopenharmony_ci    #[test]
459319625d8cSopenharmony_ci    fn positional_display_multiple_occurrences() {
459419625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).action(ArgAction::Append);
459519625d8cSopenharmony_ci        p._build();
459619625d8cSopenharmony_ci
459719625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[pos]...");
459819625d8cSopenharmony_ci    }
459919625d8cSopenharmony_ci
460019625d8cSopenharmony_ci    #[test]
460119625d8cSopenharmony_ci    fn positional_display_multiple_occurrences_required() {
460219625d8cSopenharmony_ci        let mut p = Arg::new("pos")
460319625d8cSopenharmony_ci            .index(1)
460419625d8cSopenharmony_ci            .action(ArgAction::Append)
460519625d8cSopenharmony_ci            .required(true);
460619625d8cSopenharmony_ci        p._build();
460719625d8cSopenharmony_ci
460819625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<pos>...");
460919625d8cSopenharmony_ci    }
461019625d8cSopenharmony_ci
461119625d8cSopenharmony_ci    #[test]
461219625d8cSopenharmony_ci    fn positional_display_required() {
461319625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).required(true);
461419625d8cSopenharmony_ci        p._build();
461519625d8cSopenharmony_ci
461619625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<pos>");
461719625d8cSopenharmony_ci    }
461819625d8cSopenharmony_ci
461919625d8cSopenharmony_ci    #[test]
462019625d8cSopenharmony_ci    fn positional_display_val_names() {
462119625d8cSopenharmony_ci        let mut p = Arg::new("pos").index(1).value_names(["file1", "file2"]);
462219625d8cSopenharmony_ci        p._build();
462319625d8cSopenharmony_ci
462419625d8cSopenharmony_ci        assert_eq!(p.to_string(), "[file1] [file2]");
462519625d8cSopenharmony_ci    }
462619625d8cSopenharmony_ci
462719625d8cSopenharmony_ci    #[test]
462819625d8cSopenharmony_ci    fn positional_display_val_names_required() {
462919625d8cSopenharmony_ci        let mut p = Arg::new("pos")
463019625d8cSopenharmony_ci            .index(1)
463119625d8cSopenharmony_ci            .value_names(["file1", "file2"])
463219625d8cSopenharmony_ci            .required(true);
463319625d8cSopenharmony_ci        p._build();
463419625d8cSopenharmony_ci
463519625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<file1> <file2>");
463619625d8cSopenharmony_ci    }
463719625d8cSopenharmony_ci
463819625d8cSopenharmony_ci    #[test]
463919625d8cSopenharmony_ci    fn positional_display_val_names_req() {
464019625d8cSopenharmony_ci        let mut p = Arg::new("pos")
464119625d8cSopenharmony_ci            .index(1)
464219625d8cSopenharmony_ci            .required(true)
464319625d8cSopenharmony_ci            .value_names(["file1", "file2"]);
464419625d8cSopenharmony_ci        p._build();
464519625d8cSopenharmony_ci
464619625d8cSopenharmony_ci        assert_eq!(p.to_string(), "<file1> <file2>");
464719625d8cSopenharmony_ci    }
464819625d8cSopenharmony_ci}
4649