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