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