119625d8cSopenharmony_ci/// Behavior of arguments when they are encountered while parsing 219625d8cSopenharmony_ci/// 319625d8cSopenharmony_ci/// # Examples 419625d8cSopenharmony_ci/// 519625d8cSopenharmony_ci#[cfg_attr(not(feature = "help"), doc = " ```ignore")] 619625d8cSopenharmony_ci#[cfg_attr(feature = "help", doc = " ```")] 719625d8cSopenharmony_ci/// # use clap::Command; 819625d8cSopenharmony_ci/// # use clap::Arg; 919625d8cSopenharmony_ci/// let cmd = Command::new("mycmd") 1019625d8cSopenharmony_ci/// .arg( 1119625d8cSopenharmony_ci/// Arg::new("special-help") 1219625d8cSopenharmony_ci/// .short('?') 1319625d8cSopenharmony_ci/// .action(clap::ArgAction::Help) 1419625d8cSopenharmony_ci/// ); 1519625d8cSopenharmony_ci/// 1619625d8cSopenharmony_ci/// // Existing help still exists 1719625d8cSopenharmony_ci/// let err = cmd.clone().try_get_matches_from(["mycmd", "-h"]).unwrap_err(); 1819625d8cSopenharmony_ci/// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp); 1919625d8cSopenharmony_ci/// 2019625d8cSopenharmony_ci/// // New help available 2119625d8cSopenharmony_ci/// let err = cmd.try_get_matches_from(["mycmd", "-?"]).unwrap_err(); 2219625d8cSopenharmony_ci/// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp); 2319625d8cSopenharmony_ci/// ``` 2419625d8cSopenharmony_ci#[derive(Clone, Debug)] 2519625d8cSopenharmony_ci#[non_exhaustive] 2619625d8cSopenharmony_ci#[allow(missing_copy_implementations)] // In the future, we may accept `Box<dyn ...>` 2719625d8cSopenharmony_cipub enum ArgAction { 2819625d8cSopenharmony_ci /// When encountered, store the associated value(s) in [`ArgMatches`][crate::ArgMatches] 2919625d8cSopenharmony_ci /// 3019625d8cSopenharmony_ci /// **NOTE:** If the argument has previously been seen, it will result in a 3119625d8cSopenharmony_ci /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless 3219625d8cSopenharmony_ci /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set. 3319625d8cSopenharmony_ci /// 3419625d8cSopenharmony_ci /// # Examples 3519625d8cSopenharmony_ci /// 3619625d8cSopenharmony_ci /// ```rust 3719625d8cSopenharmony_ci /// # use clap::Command; 3819625d8cSopenharmony_ci /// # use clap::Arg; 3919625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 4019625d8cSopenharmony_ci /// .arg( 4119625d8cSopenharmony_ci /// Arg::new("flag") 4219625d8cSopenharmony_ci /// .long("flag") 4319625d8cSopenharmony_ci /// .action(clap::ArgAction::Set) 4419625d8cSopenharmony_ci /// ); 4519625d8cSopenharmony_ci /// 4619625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd", "--flag", "value"]).unwrap(); 4719625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 4819625d8cSopenharmony_ci /// assert_eq!( 4919625d8cSopenharmony_ci /// matches.get_many::<String>("flag").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(), 5019625d8cSopenharmony_ci /// vec!["value"] 5119625d8cSopenharmony_ci /// ); 5219625d8cSopenharmony_ci /// ``` 5319625d8cSopenharmony_ci Set, 5419625d8cSopenharmony_ci /// When encountered, store the associated value(s) in [`ArgMatches`][crate::ArgMatches] 5519625d8cSopenharmony_ci /// 5619625d8cSopenharmony_ci /// # Examples 5719625d8cSopenharmony_ci /// 5819625d8cSopenharmony_ci /// ```rust 5919625d8cSopenharmony_ci /// # use clap::Command; 6019625d8cSopenharmony_ci /// # use clap::Arg; 6119625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 6219625d8cSopenharmony_ci /// .arg( 6319625d8cSopenharmony_ci /// Arg::new("flag") 6419625d8cSopenharmony_ci /// .long("flag") 6519625d8cSopenharmony_ci /// .action(clap::ArgAction::Append) 6619625d8cSopenharmony_ci /// ); 6719625d8cSopenharmony_ci /// 6819625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd", "--flag", "value1", "--flag", "value2"]).unwrap(); 6919625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 7019625d8cSopenharmony_ci /// assert_eq!( 7119625d8cSopenharmony_ci /// matches.get_many::<String>("flag").unwrap_or_default().map(|v| v.as_str()).collect::<Vec<_>>(), 7219625d8cSopenharmony_ci /// vec!["value1", "value2"] 7319625d8cSopenharmony_ci /// ); 7419625d8cSopenharmony_ci /// ``` 7519625d8cSopenharmony_ci Append, 7619625d8cSopenharmony_ci /// When encountered, act as if `"true"` was encountered on the command-line 7719625d8cSopenharmony_ci /// 7819625d8cSopenharmony_ci /// If no [`default_value`][super::Arg::default_value] is set, it will be `false`. 7919625d8cSopenharmony_ci /// 8019625d8cSopenharmony_ci /// No value is allowed. To optionally accept a value, see 8119625d8cSopenharmony_ci /// [`Arg::default_missing_value`][super::Arg::default_missing_value] 8219625d8cSopenharmony_ci /// 8319625d8cSopenharmony_ci /// **NOTE:** If the argument has previously been seen, it will result in a 8419625d8cSopenharmony_ci /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless 8519625d8cSopenharmony_ci /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set. 8619625d8cSopenharmony_ci /// 8719625d8cSopenharmony_ci /// # Examples 8819625d8cSopenharmony_ci /// 8919625d8cSopenharmony_ci /// ```rust 9019625d8cSopenharmony_ci /// # use clap::Command; 9119625d8cSopenharmony_ci /// # use clap::Arg; 9219625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 9319625d8cSopenharmony_ci /// .arg( 9419625d8cSopenharmony_ci /// Arg::new("flag") 9519625d8cSopenharmony_ci /// .long("flag") 9619625d8cSopenharmony_ci /// .action(clap::ArgAction::SetTrue) 9719625d8cSopenharmony_ci /// ); 9819625d8cSopenharmony_ci /// 9919625d8cSopenharmony_ci /// let matches = cmd.clone().try_get_matches_from(["mycmd", "--flag"]).unwrap(); 10019625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 10119625d8cSopenharmony_ci /// assert_eq!( 10219625d8cSopenharmony_ci /// matches.get_flag("flag"), 10319625d8cSopenharmony_ci /// true 10419625d8cSopenharmony_ci /// ); 10519625d8cSopenharmony_ci /// 10619625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd"]).unwrap(); 10719625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 10819625d8cSopenharmony_ci /// assert_eq!( 10919625d8cSopenharmony_ci /// matches.get_flag("flag"), 11019625d8cSopenharmony_ci /// false 11119625d8cSopenharmony_ci /// ); 11219625d8cSopenharmony_ci /// ``` 11319625d8cSopenharmony_ci /// 11419625d8cSopenharmony_ci /// You can use [`TypedValueParser::map`][crate::builder::TypedValueParser::map] to have the 11519625d8cSopenharmony_ci /// flag control an application-specific type: 11619625d8cSopenharmony_ci /// ```rust 11719625d8cSopenharmony_ci /// # use clap::Command; 11819625d8cSopenharmony_ci /// # use clap::Arg; 11919625d8cSopenharmony_ci /// # use clap::builder::TypedValueParser as _; 12019625d8cSopenharmony_ci /// # use clap::builder::BoolishValueParser; 12119625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 12219625d8cSopenharmony_ci /// .arg( 12319625d8cSopenharmony_ci /// Arg::new("flag") 12419625d8cSopenharmony_ci /// .long("flag") 12519625d8cSopenharmony_ci /// .action(clap::ArgAction::SetTrue) 12619625d8cSopenharmony_ci /// .value_parser( 12719625d8cSopenharmony_ci /// BoolishValueParser::new() 12819625d8cSopenharmony_ci /// .map(|b| -> usize { 12919625d8cSopenharmony_ci /// if b { 10 } else { 5 } 13019625d8cSopenharmony_ci /// }) 13119625d8cSopenharmony_ci /// ) 13219625d8cSopenharmony_ci /// ); 13319625d8cSopenharmony_ci /// 13419625d8cSopenharmony_ci /// let matches = cmd.clone().try_get_matches_from(["mycmd", "--flag"]).unwrap(); 13519625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 13619625d8cSopenharmony_ci /// assert_eq!( 13719625d8cSopenharmony_ci /// matches.get_one::<usize>("flag").copied(), 13819625d8cSopenharmony_ci /// Some(10) 13919625d8cSopenharmony_ci /// ); 14019625d8cSopenharmony_ci /// 14119625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd"]).unwrap(); 14219625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 14319625d8cSopenharmony_ci /// assert_eq!( 14419625d8cSopenharmony_ci /// matches.get_one::<usize>("flag").copied(), 14519625d8cSopenharmony_ci /// Some(5) 14619625d8cSopenharmony_ci /// ); 14719625d8cSopenharmony_ci /// ``` 14819625d8cSopenharmony_ci SetTrue, 14919625d8cSopenharmony_ci /// When encountered, act as if `"false"` was encountered on the command-line 15019625d8cSopenharmony_ci /// 15119625d8cSopenharmony_ci /// If no [`default_value`][super::Arg::default_value] is set, it will be `true`. 15219625d8cSopenharmony_ci /// 15319625d8cSopenharmony_ci /// No value is allowed. To optionally accept a value, see 15419625d8cSopenharmony_ci /// [`Arg::default_missing_value`][super::Arg::default_missing_value] 15519625d8cSopenharmony_ci /// 15619625d8cSopenharmony_ci /// **NOTE:** If the argument has previously been seen, it will result in a 15719625d8cSopenharmony_ci /// [`ArgumentConflict`][crate::error::ErrorKind::ArgumentConflict] unless 15819625d8cSopenharmony_ci /// [`Command::args_override_self(true)`][crate::Command::args_override_self] is set. 15919625d8cSopenharmony_ci /// 16019625d8cSopenharmony_ci /// # Examples 16119625d8cSopenharmony_ci /// 16219625d8cSopenharmony_ci /// ```rust 16319625d8cSopenharmony_ci /// # use clap::Command; 16419625d8cSopenharmony_ci /// # use clap::Arg; 16519625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 16619625d8cSopenharmony_ci /// .arg( 16719625d8cSopenharmony_ci /// Arg::new("flag") 16819625d8cSopenharmony_ci /// .long("flag") 16919625d8cSopenharmony_ci /// .action(clap::ArgAction::SetFalse) 17019625d8cSopenharmony_ci /// ); 17119625d8cSopenharmony_ci /// 17219625d8cSopenharmony_ci /// let matches = cmd.clone().try_get_matches_from(["mycmd", "--flag"]).unwrap(); 17319625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 17419625d8cSopenharmony_ci /// assert_eq!( 17519625d8cSopenharmony_ci /// matches.get_flag("flag"), 17619625d8cSopenharmony_ci /// false 17719625d8cSopenharmony_ci /// ); 17819625d8cSopenharmony_ci /// 17919625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd"]).unwrap(); 18019625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 18119625d8cSopenharmony_ci /// assert_eq!( 18219625d8cSopenharmony_ci /// matches.get_flag("flag"), 18319625d8cSopenharmony_ci /// true 18419625d8cSopenharmony_ci /// ); 18519625d8cSopenharmony_ci /// ``` 18619625d8cSopenharmony_ci SetFalse, 18719625d8cSopenharmony_ci /// When encountered, increment a `u8` counter 18819625d8cSopenharmony_ci /// 18919625d8cSopenharmony_ci /// If no [`default_value`][super::Arg::default_value] is set, it will be `0`. 19019625d8cSopenharmony_ci /// 19119625d8cSopenharmony_ci /// No value is allowed. To optionally accept a value, see 19219625d8cSopenharmony_ci /// [`Arg::default_missing_value`][super::Arg::default_missing_value] 19319625d8cSopenharmony_ci /// 19419625d8cSopenharmony_ci /// # Examples 19519625d8cSopenharmony_ci /// 19619625d8cSopenharmony_ci /// ```rust 19719625d8cSopenharmony_ci /// # use clap::Command; 19819625d8cSopenharmony_ci /// # use clap::Arg; 19919625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 20019625d8cSopenharmony_ci /// .arg( 20119625d8cSopenharmony_ci /// Arg::new("flag") 20219625d8cSopenharmony_ci /// .long("flag") 20319625d8cSopenharmony_ci /// .action(clap::ArgAction::Count) 20419625d8cSopenharmony_ci /// ); 20519625d8cSopenharmony_ci /// 20619625d8cSopenharmony_ci /// let matches = cmd.clone().try_get_matches_from(["mycmd", "--flag", "--flag"]).unwrap(); 20719625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 20819625d8cSopenharmony_ci /// assert_eq!( 20919625d8cSopenharmony_ci /// matches.get_count("flag"), 21019625d8cSopenharmony_ci /// 2 21119625d8cSopenharmony_ci /// ); 21219625d8cSopenharmony_ci /// 21319625d8cSopenharmony_ci /// let matches = cmd.try_get_matches_from(["mycmd"]).unwrap(); 21419625d8cSopenharmony_ci /// assert!(matches.contains_id("flag")); 21519625d8cSopenharmony_ci /// assert_eq!( 21619625d8cSopenharmony_ci /// matches.get_count("flag"), 21719625d8cSopenharmony_ci /// 0 21819625d8cSopenharmony_ci /// ); 21919625d8cSopenharmony_ci /// ``` 22019625d8cSopenharmony_ci Count, 22119625d8cSopenharmony_ci /// When encountered, display [`Command::print_help`][super::Command::print_help] 22219625d8cSopenharmony_ci /// 22319625d8cSopenharmony_ci /// Depending on the flag, [`Command::print_long_help`][super::Command::print_long_help] may be shown 22419625d8cSopenharmony_ci /// 22519625d8cSopenharmony_ci /// # Examples 22619625d8cSopenharmony_ci /// 22719625d8cSopenharmony_ci #[cfg_attr(not(feature = "help"), doc = " ```ignore")] 22819625d8cSopenharmony_ci #[cfg_attr(feature = "help", doc = " ```")] 22919625d8cSopenharmony_ci /// # use clap::Command; 23019625d8cSopenharmony_ci /// # use clap::Arg; 23119625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 23219625d8cSopenharmony_ci /// .arg( 23319625d8cSopenharmony_ci /// Arg::new("special-help") 23419625d8cSopenharmony_ci /// .short('?') 23519625d8cSopenharmony_ci /// .action(clap::ArgAction::Help) 23619625d8cSopenharmony_ci /// ); 23719625d8cSopenharmony_ci /// 23819625d8cSopenharmony_ci /// // Existing help still exists 23919625d8cSopenharmony_ci /// let err = cmd.clone().try_get_matches_from(["mycmd", "-h"]).unwrap_err(); 24019625d8cSopenharmony_ci /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp); 24119625d8cSopenharmony_ci /// 24219625d8cSopenharmony_ci /// // New help available 24319625d8cSopenharmony_ci /// let err = cmd.try_get_matches_from(["mycmd", "-?"]).unwrap_err(); 24419625d8cSopenharmony_ci /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayHelp); 24519625d8cSopenharmony_ci /// ``` 24619625d8cSopenharmony_ci Help, 24719625d8cSopenharmony_ci /// When encountered, display [`Command::version`][super::Command::version] 24819625d8cSopenharmony_ci /// 24919625d8cSopenharmony_ci /// Depending on the flag, [`Command::long_version`][super::Command::long_version] may be shown 25019625d8cSopenharmony_ci /// 25119625d8cSopenharmony_ci /// # Examples 25219625d8cSopenharmony_ci /// 25319625d8cSopenharmony_ci /// ```rust 25419625d8cSopenharmony_ci /// # use clap::Command; 25519625d8cSopenharmony_ci /// # use clap::Arg; 25619625d8cSopenharmony_ci /// let cmd = Command::new("mycmd") 25719625d8cSopenharmony_ci /// .version("1.0.0") 25819625d8cSopenharmony_ci /// .arg( 25919625d8cSopenharmony_ci /// Arg::new("special-version") 26019625d8cSopenharmony_ci /// .long("special-version") 26119625d8cSopenharmony_ci /// .action(clap::ArgAction::Version) 26219625d8cSopenharmony_ci /// ); 26319625d8cSopenharmony_ci /// 26419625d8cSopenharmony_ci /// // Existing help still exists 26519625d8cSopenharmony_ci /// let err = cmd.clone().try_get_matches_from(["mycmd", "--version"]).unwrap_err(); 26619625d8cSopenharmony_ci /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion); 26719625d8cSopenharmony_ci /// 26819625d8cSopenharmony_ci /// // New help available 26919625d8cSopenharmony_ci /// let err = cmd.try_get_matches_from(["mycmd", "--special-version"]).unwrap_err(); 27019625d8cSopenharmony_ci /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion); 27119625d8cSopenharmony_ci /// ``` 27219625d8cSopenharmony_ci Version, 27319625d8cSopenharmony_ci} 27419625d8cSopenharmony_ci 27519625d8cSopenharmony_ciimpl ArgAction { 27619625d8cSopenharmony_ci /// Returns whether this action accepts values on the command-line 27719625d8cSopenharmony_ci /// 27819625d8cSopenharmony_ci /// [`default_values`][super::Arg::default_values] and [`env`][super::Arg::env] may still be 27919625d8cSopenharmony_ci /// processed. 28019625d8cSopenharmony_ci pub fn takes_values(&self) -> bool { 28119625d8cSopenharmony_ci match self { 28219625d8cSopenharmony_ci Self::Set => true, 28319625d8cSopenharmony_ci Self::Append => true, 28419625d8cSopenharmony_ci Self::SetTrue => false, 28519625d8cSopenharmony_ci Self::SetFalse => false, 28619625d8cSopenharmony_ci Self::Count => false, 28719625d8cSopenharmony_ci Self::Help => false, 28819625d8cSopenharmony_ci Self::Version => false, 28919625d8cSopenharmony_ci } 29019625d8cSopenharmony_ci } 29119625d8cSopenharmony_ci 29219625d8cSopenharmony_ci pub(crate) fn default_value(&self) -> Option<&'static std::ffi::OsStr> { 29319625d8cSopenharmony_ci match self { 29419625d8cSopenharmony_ci Self::Set => None, 29519625d8cSopenharmony_ci Self::Append => None, 29619625d8cSopenharmony_ci Self::SetTrue => Some(std::ffi::OsStr::new("false")), 29719625d8cSopenharmony_ci Self::SetFalse => Some(std::ffi::OsStr::new("true")), 29819625d8cSopenharmony_ci Self::Count => Some(std::ffi::OsStr::new("0")), 29919625d8cSopenharmony_ci Self::Help => None, 30019625d8cSopenharmony_ci Self::Version => None, 30119625d8cSopenharmony_ci } 30219625d8cSopenharmony_ci } 30319625d8cSopenharmony_ci 30419625d8cSopenharmony_ci pub(crate) fn default_missing_value(&self) -> Option<&'static std::ffi::OsStr> { 30519625d8cSopenharmony_ci match self { 30619625d8cSopenharmony_ci Self::Set => None, 30719625d8cSopenharmony_ci Self::Append => None, 30819625d8cSopenharmony_ci Self::SetTrue => Some(std::ffi::OsStr::new("true")), 30919625d8cSopenharmony_ci Self::SetFalse => Some(std::ffi::OsStr::new("false")), 31019625d8cSopenharmony_ci Self::Count => None, 31119625d8cSopenharmony_ci Self::Help => None, 31219625d8cSopenharmony_ci Self::Version => None, 31319625d8cSopenharmony_ci } 31419625d8cSopenharmony_ci } 31519625d8cSopenharmony_ci 31619625d8cSopenharmony_ci pub(crate) fn default_value_parser(&self) -> Option<super::ValueParser> { 31719625d8cSopenharmony_ci match self { 31819625d8cSopenharmony_ci Self::Set => None, 31919625d8cSopenharmony_ci Self::Append => None, 32019625d8cSopenharmony_ci Self::SetTrue => Some(super::ValueParser::bool()), 32119625d8cSopenharmony_ci Self::SetFalse => Some(super::ValueParser::bool()), 32219625d8cSopenharmony_ci Self::Count => Some(crate::value_parser!(u8).into()), 32319625d8cSopenharmony_ci Self::Help => None, 32419625d8cSopenharmony_ci Self::Version => None, 32519625d8cSopenharmony_ci } 32619625d8cSopenharmony_ci } 32719625d8cSopenharmony_ci 32819625d8cSopenharmony_ci #[cfg(debug_assertions)] 32919625d8cSopenharmony_ci pub(crate) fn value_type_id(&self) -> Option<crate::parser::AnyValueId> { 33019625d8cSopenharmony_ci use crate::parser::AnyValueId; 33119625d8cSopenharmony_ci 33219625d8cSopenharmony_ci match self { 33319625d8cSopenharmony_ci Self::Set => None, 33419625d8cSopenharmony_ci Self::Append => None, 33519625d8cSopenharmony_ci Self::SetTrue => None, 33619625d8cSopenharmony_ci Self::SetFalse => None, 33719625d8cSopenharmony_ci Self::Count => Some(AnyValueId::of::<CountType>()), 33819625d8cSopenharmony_ci Self::Help => None, 33919625d8cSopenharmony_ci Self::Version => None, 34019625d8cSopenharmony_ci } 34119625d8cSopenharmony_ci } 34219625d8cSopenharmony_ci} 34319625d8cSopenharmony_ci 34419625d8cSopenharmony_cipub(crate) type CountType = u8; 345