119625d8cSopenharmony_ci/// Command line argument parser kind of error
219625d8cSopenharmony_ci#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
319625d8cSopenharmony_ci#[non_exhaustive]
419625d8cSopenharmony_cipub enum ErrorKind {
519625d8cSopenharmony_ci    /// Occurs when an [`Arg`][crate::Arg] has a set of possible values,
619625d8cSopenharmony_ci    /// and the user provides a value which isn't in that set.
719625d8cSopenharmony_ci    ///
819625d8cSopenharmony_ci    /// # Examples
919625d8cSopenharmony_ci    ///
1019625d8cSopenharmony_ci    /// ```rust
1119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
1219625d8cSopenharmony_ci    /// let result = Command::new("prog")
1319625d8cSopenharmony_ci    ///     .arg(Arg::new("speed")
1419625d8cSopenharmony_ci    ///         .value_parser(["fast", "slow"]))
1519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "other"]);
1619625d8cSopenharmony_ci    /// assert!(result.is_err());
1719625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue);
1819625d8cSopenharmony_ci    /// ```
1919625d8cSopenharmony_ci    InvalidValue,
2019625d8cSopenharmony_ci
2119625d8cSopenharmony_ci    /// Occurs when a user provides a flag, option, argument or subcommand which isn't defined.
2219625d8cSopenharmony_ci    ///
2319625d8cSopenharmony_ci    /// # Examples
2419625d8cSopenharmony_ci    ///
2519625d8cSopenharmony_ci    /// ```rust
2619625d8cSopenharmony_ci    /// # use clap::{Command, arg, error::ErrorKind};
2719625d8cSopenharmony_ci    /// let result = Command::new("prog")
2819625d8cSopenharmony_ci    ///     .arg(arg!(--flag "some flag"))
2919625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--other"]);
3019625d8cSopenharmony_ci    /// assert!(result.is_err());
3119625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::UnknownArgument);
3219625d8cSopenharmony_ci    /// ```
3319625d8cSopenharmony_ci    UnknownArgument,
3419625d8cSopenharmony_ci
3519625d8cSopenharmony_ci    /// Occurs when the user provides an unrecognized [`Subcommand`] which meets the threshold for
3619625d8cSopenharmony_ci    /// being similar enough to an existing subcommand.
3719625d8cSopenharmony_ci    /// If it doesn't meet the threshold, or the 'suggestions' feature is disabled,
3819625d8cSopenharmony_ci    /// the more general [`UnknownArgument`] error is returned.
3919625d8cSopenharmony_ci    ///
4019625d8cSopenharmony_ci    /// # Examples
4119625d8cSopenharmony_ci    ///
4219625d8cSopenharmony_ci    #[cfg_attr(not(feature = "suggestions"), doc = " ```no_run")]
4319625d8cSopenharmony_ci    #[cfg_attr(feature = "suggestions", doc = " ```")]
4419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, };
4519625d8cSopenharmony_ci    /// let result = Command::new("prog")
4619625d8cSopenharmony_ci    ///     .subcommand(Command::new("config")
4719625d8cSopenharmony_ci    ///         .about("Used for configuration")
4819625d8cSopenharmony_ci    ///         .arg(Arg::new("config_file")
4919625d8cSopenharmony_ci    ///             .help("The configuration file to use")))
5019625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "confi"]);
5119625d8cSopenharmony_ci    /// assert!(result.is_err());
5219625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
5319625d8cSopenharmony_ci    /// ```
5419625d8cSopenharmony_ci    ///
5519625d8cSopenharmony_ci    /// [`Subcommand`]: crate::Subcommand
5619625d8cSopenharmony_ci    /// [`UnknownArgument`]: ErrorKind::UnknownArgument
5719625d8cSopenharmony_ci    InvalidSubcommand,
5819625d8cSopenharmony_ci
5919625d8cSopenharmony_ci    /// Occurs when the user doesn't use equals for an option that requires equal
6019625d8cSopenharmony_ci    /// sign to provide values.
6119625d8cSopenharmony_ci    ///
6219625d8cSopenharmony_ci    /// ```rust
6319625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
6419625d8cSopenharmony_ci    /// let res = Command::new("prog")
6519625d8cSopenharmony_ci    ///     .arg(Arg::new("color")
6619625d8cSopenharmony_ci    ///          .action(ArgAction::Set)
6719625d8cSopenharmony_ci    ///          .require_equals(true)
6819625d8cSopenharmony_ci    ///          .long("color"))
6919625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--color", "red"]);
7019625d8cSopenharmony_ci    /// assert!(res.is_err());
7119625d8cSopenharmony_ci    /// assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals);
7219625d8cSopenharmony_ci    /// ```
7319625d8cSopenharmony_ci    NoEquals,
7419625d8cSopenharmony_ci
7519625d8cSopenharmony_ci    /// Occurs when the user provides a value for an argument with a custom validation and the
7619625d8cSopenharmony_ci    /// value fails that validation.
7719625d8cSopenharmony_ci    ///
7819625d8cSopenharmony_ci    /// # Examples
7919625d8cSopenharmony_ci    ///
8019625d8cSopenharmony_ci    /// ```rust
8119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, value_parser};
8219625d8cSopenharmony_ci    /// fn is_numeric(val: &str) -> Result<(), String> {
8319625d8cSopenharmony_ci    ///     match val.parse::<i64>() {
8419625d8cSopenharmony_ci    ///         Ok(..) => Ok(()),
8519625d8cSopenharmony_ci    ///         Err(..) => Err(String::from("value wasn't a number!")),
8619625d8cSopenharmony_ci    ///     }
8719625d8cSopenharmony_ci    /// }
8819625d8cSopenharmony_ci    ///
8919625d8cSopenharmony_ci    /// let result = Command::new("prog")
9019625d8cSopenharmony_ci    ///     .arg(Arg::new("num")
9119625d8cSopenharmony_ci    ///          .value_parser(value_parser!(u8)))
9219625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "NotANumber"]);
9319625d8cSopenharmony_ci    /// assert!(result.is_err());
9419625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::ValueValidation);
9519625d8cSopenharmony_ci    /// ```
9619625d8cSopenharmony_ci    ValueValidation,
9719625d8cSopenharmony_ci
9819625d8cSopenharmony_ci    /// Occurs when a user provides more values for an argument than were defined by setting
9919625d8cSopenharmony_ci    /// [`Arg::num_args`].
10019625d8cSopenharmony_ci    ///
10119625d8cSopenharmony_ci    /// # Examples
10219625d8cSopenharmony_ci    ///
10319625d8cSopenharmony_ci    /// ```rust
10419625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
10519625d8cSopenharmony_ci    /// let result = Command::new("prog")
10619625d8cSopenharmony_ci    ///     .arg(Arg::new("arg")
10719625d8cSopenharmony_ci    ///         .num_args(1..=2))
10819625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "too", "many", "values"]);
10919625d8cSopenharmony_ci    /// assert!(result.is_err());
11019625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::TooManyValues);
11119625d8cSopenharmony_ci    /// ```
11219625d8cSopenharmony_ci    /// [`Arg::num_args`]: crate::Arg::num_args()
11319625d8cSopenharmony_ci    TooManyValues,
11419625d8cSopenharmony_ci
11519625d8cSopenharmony_ci    /// Occurs when the user provides fewer values for an argument than were defined by setting
11619625d8cSopenharmony_ci    /// [`Arg::num_args`].
11719625d8cSopenharmony_ci    ///
11819625d8cSopenharmony_ci    /// # Examples
11919625d8cSopenharmony_ci    ///
12019625d8cSopenharmony_ci    /// ```rust
12119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
12219625d8cSopenharmony_ci    /// let result = Command::new("prog")
12319625d8cSopenharmony_ci    ///     .arg(Arg::new("some_opt")
12419625d8cSopenharmony_ci    ///         .long("opt")
12519625d8cSopenharmony_ci    ///         .num_args(3..))
12619625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--opt", "too", "few"]);
12719625d8cSopenharmony_ci    /// assert!(result.is_err());
12819625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::TooFewValues);
12919625d8cSopenharmony_ci    /// ```
13019625d8cSopenharmony_ci    /// [`Arg::num_args`]: crate::Arg::num_args()
13119625d8cSopenharmony_ci    TooFewValues,
13219625d8cSopenharmony_ci
13319625d8cSopenharmony_ci    /// Occurs when the user provides a different number of values for an argument than what's
13419625d8cSopenharmony_ci    /// been defined by setting [`Arg::num_args`] or than was implicitly set by
13519625d8cSopenharmony_ci    /// [`Arg::value_names`].
13619625d8cSopenharmony_ci    ///
13719625d8cSopenharmony_ci    /// # Examples
13819625d8cSopenharmony_ci    ///
13919625d8cSopenharmony_ci    /// ```rust
14019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
14119625d8cSopenharmony_ci    /// let result = Command::new("prog")
14219625d8cSopenharmony_ci    ///     .arg(Arg::new("some_opt")
14319625d8cSopenharmony_ci    ///         .long("opt")
14419625d8cSopenharmony_ci    ///         .action(ArgAction::Set)
14519625d8cSopenharmony_ci    ///         .num_args(2))
14619625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--opt", "wrong"]);
14719625d8cSopenharmony_ci    /// assert!(result.is_err());
14819625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
14919625d8cSopenharmony_ci    /// ```
15019625d8cSopenharmony_ci    ///
15119625d8cSopenharmony_ci    /// [`Arg::num_args`]: crate::Arg::num_args()
15219625d8cSopenharmony_ci    /// [`Arg::value_names`]: crate::Arg::value_names()
15319625d8cSopenharmony_ci    WrongNumberOfValues,
15419625d8cSopenharmony_ci
15519625d8cSopenharmony_ci    /// Occurs when the user provides two values which conflict with each other and can't be used
15619625d8cSopenharmony_ci    /// together.
15719625d8cSopenharmony_ci    ///
15819625d8cSopenharmony_ci    /// # Examples
15919625d8cSopenharmony_ci    ///
16019625d8cSopenharmony_ci    /// ```rust
16119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
16219625d8cSopenharmony_ci    /// let result = Command::new("prog")
16319625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
16419625d8cSopenharmony_ci    ///         .long("debug")
16519625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue)
16619625d8cSopenharmony_ci    ///         .conflicts_with("color"))
16719625d8cSopenharmony_ci    ///     .arg(Arg::new("color")
16819625d8cSopenharmony_ci    ///         .long("color")
16919625d8cSopenharmony_ci    ///         .action(ArgAction::SetTrue))
17019625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--debug", "--color"]);
17119625d8cSopenharmony_ci    /// assert!(result.is_err());
17219625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict);
17319625d8cSopenharmony_ci    /// ```
17419625d8cSopenharmony_ci    ArgumentConflict,
17519625d8cSopenharmony_ci
17619625d8cSopenharmony_ci    /// Occurs when the user does not provide one or more required arguments.
17719625d8cSopenharmony_ci    ///
17819625d8cSopenharmony_ci    /// # Examples
17919625d8cSopenharmony_ci    ///
18019625d8cSopenharmony_ci    /// ```rust
18119625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
18219625d8cSopenharmony_ci    /// let result = Command::new("prog")
18319625d8cSopenharmony_ci    ///     .arg(Arg::new("debug")
18419625d8cSopenharmony_ci    ///         .required(true))
18519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog"]);
18619625d8cSopenharmony_ci    /// assert!(result.is_err());
18719625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
18819625d8cSopenharmony_ci    /// ```
18919625d8cSopenharmony_ci    MissingRequiredArgument,
19019625d8cSopenharmony_ci
19119625d8cSopenharmony_ci    /// Occurs when a subcommand is required (as defined by [`Command::subcommand_required`]),
19219625d8cSopenharmony_ci    /// but the user does not provide one.
19319625d8cSopenharmony_ci    ///
19419625d8cSopenharmony_ci    /// # Examples
19519625d8cSopenharmony_ci    ///
19619625d8cSopenharmony_ci    /// ```rust
19719625d8cSopenharmony_ci    /// # use clap::{Command, error::ErrorKind};
19819625d8cSopenharmony_ci    /// let err = Command::new("prog")
19919625d8cSopenharmony_ci    ///     .subcommand_required(true)
20019625d8cSopenharmony_ci    ///     .subcommand(Command::new("test"))
20119625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![
20219625d8cSopenharmony_ci    ///         "myprog",
20319625d8cSopenharmony_ci    ///     ]);
20419625d8cSopenharmony_ci    /// assert!(err.is_err());
20519625d8cSopenharmony_ci    /// assert_eq!(err.unwrap_err().kind(), ErrorKind::MissingSubcommand);
20619625d8cSopenharmony_ci    /// # ;
20719625d8cSopenharmony_ci    /// ```
20819625d8cSopenharmony_ci    ///
20919625d8cSopenharmony_ci    /// [`Command::subcommand_required`]: crate::Command::subcommand_required
21019625d8cSopenharmony_ci    MissingSubcommand,
21119625d8cSopenharmony_ci
21219625d8cSopenharmony_ci    /// Occurs when the user provides a value containing invalid UTF-8.
21319625d8cSopenharmony_ci    ///
21419625d8cSopenharmony_ci    /// To allow arbitrary data
21519625d8cSopenharmony_ci    /// - Set [`Arg::value_parser(value_parser!(OsString))`] for argument values
21619625d8cSopenharmony_ci    /// - Set [`Command::external_subcommand_value_parser`] for external-subcommand
21719625d8cSopenharmony_ci    ///   values
21819625d8cSopenharmony_ci    ///
21919625d8cSopenharmony_ci    /// # Platform Specific
22019625d8cSopenharmony_ci    ///
22119625d8cSopenharmony_ci    /// Non-Windows platforms only (such as Linux, Unix, OSX, etc.)
22219625d8cSopenharmony_ci    ///
22319625d8cSopenharmony_ci    /// # Examples
22419625d8cSopenharmony_ci    ///
22519625d8cSopenharmony_ci    #[cfg_attr(not(unix), doc = " ```ignore")]
22619625d8cSopenharmony_ci    #[cfg_attr(unix, doc = " ```")]
22719625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, ArgAction};
22819625d8cSopenharmony_ci    /// # use std::os::unix::ffi::OsStringExt;
22919625d8cSopenharmony_ci    /// # use std::ffi::OsString;
23019625d8cSopenharmony_ci    /// let result = Command::new("prog")
23119625d8cSopenharmony_ci    ///     .arg(Arg::new("utf8")
23219625d8cSopenharmony_ci    ///         .short('u')
23319625d8cSopenharmony_ci    ///         .action(ArgAction::Set))
23419625d8cSopenharmony_ci    ///     .try_get_matches_from(vec![OsString::from("myprog"),
23519625d8cSopenharmony_ci    ///                                 OsString::from("-u"),
23619625d8cSopenharmony_ci    ///                                 OsString::from_vec(vec![0xE9])]);
23719625d8cSopenharmony_ci    /// assert!(result.is_err());
23819625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidUtf8);
23919625d8cSopenharmony_ci    /// ```
24019625d8cSopenharmony_ci    ///
24119625d8cSopenharmony_ci    /// [`Arg::allow_invalid_utf8`]: crate::Arg::allow_invalid_utf8
24219625d8cSopenharmony_ci    /// [`Command::external_subcommand_value_parser`]: crate::Command::external_subcommand_value_parser
24319625d8cSopenharmony_ci    InvalidUtf8,
24419625d8cSopenharmony_ci
24519625d8cSopenharmony_ci    /// Not a true "error" as it means `--help` or similar was used.
24619625d8cSopenharmony_ci    /// The help message will be sent to `stdout`.
24719625d8cSopenharmony_ci    ///
24819625d8cSopenharmony_ci    /// **Note**: If the help is displayed due to an error (such as missing subcommands) it will
24919625d8cSopenharmony_ci    /// be sent to `stderr` instead of `stdout`.
25019625d8cSopenharmony_ci    ///
25119625d8cSopenharmony_ci    /// # Examples
25219625d8cSopenharmony_ci    ///
25319625d8cSopenharmony_ci    #[cfg_attr(not(feature = "help"), doc = " ```ignore")]
25419625d8cSopenharmony_ci    #[cfg_attr(feature = "help", doc = " ```")]
25519625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
25619625d8cSopenharmony_ci    /// let result = Command::new("prog")
25719625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--help"]);
25819625d8cSopenharmony_ci    /// assert!(result.is_err());
25919625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayHelp);
26019625d8cSopenharmony_ci    /// ```
26119625d8cSopenharmony_ci    DisplayHelp,
26219625d8cSopenharmony_ci
26319625d8cSopenharmony_ci    /// Occurs when either an argument or a [`Subcommand`] is required, as defined by
26419625d8cSopenharmony_ci    /// [`Command::arg_required_else_help`] , but the user did not provide
26519625d8cSopenharmony_ci    /// one.
26619625d8cSopenharmony_ci    ///
26719625d8cSopenharmony_ci    /// # Examples
26819625d8cSopenharmony_ci    ///
26919625d8cSopenharmony_ci    /// ```rust
27019625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind, };
27119625d8cSopenharmony_ci    /// let result = Command::new("prog")
27219625d8cSopenharmony_ci    ///     .arg_required_else_help(true)
27319625d8cSopenharmony_ci    ///     .subcommand(Command::new("config")
27419625d8cSopenharmony_ci    ///         .about("Used for configuration")
27519625d8cSopenharmony_ci    ///         .arg(Arg::new("config_file")
27619625d8cSopenharmony_ci    ///             .help("The configuration file to use")))
27719625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog"]);
27819625d8cSopenharmony_ci    /// assert!(result.is_err());
27919625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand);
28019625d8cSopenharmony_ci    /// ```
28119625d8cSopenharmony_ci    ///
28219625d8cSopenharmony_ci    /// [`Subcommand`]: crate::Subcommand
28319625d8cSopenharmony_ci    /// [`Command::arg_required_else_help`]: crate::Command::arg_required_else_help
28419625d8cSopenharmony_ci    DisplayHelpOnMissingArgumentOrSubcommand,
28519625d8cSopenharmony_ci
28619625d8cSopenharmony_ci    /// Not a true "error" as it means `--version` or similar was used.
28719625d8cSopenharmony_ci    /// The message will be sent to `stdout`.
28819625d8cSopenharmony_ci    ///
28919625d8cSopenharmony_ci    /// # Examples
29019625d8cSopenharmony_ci    ///
29119625d8cSopenharmony_ci    /// ```rust
29219625d8cSopenharmony_ci    /// # use clap::{Command, Arg, error::ErrorKind};
29319625d8cSopenharmony_ci    /// let result = Command::new("prog")
29419625d8cSopenharmony_ci    ///     .version("3.0")
29519625d8cSopenharmony_ci    ///     .try_get_matches_from(vec!["prog", "--version"]);
29619625d8cSopenharmony_ci    /// assert!(result.is_err());
29719625d8cSopenharmony_ci    /// assert_eq!(result.unwrap_err().kind(), ErrorKind::DisplayVersion);
29819625d8cSopenharmony_ci    /// ```
29919625d8cSopenharmony_ci    DisplayVersion,
30019625d8cSopenharmony_ci
30119625d8cSopenharmony_ci    /// Represents an [I/O error].
30219625d8cSopenharmony_ci    /// Can occur when writing to `stderr` or `stdout` or reading a configuration file.
30319625d8cSopenharmony_ci    ///
30419625d8cSopenharmony_ci    /// [I/O error]: std::io::Error
30519625d8cSopenharmony_ci    Io,
30619625d8cSopenharmony_ci
30719625d8cSopenharmony_ci    /// Represents a [Format error] (which is a part of [`Display`]).
30819625d8cSopenharmony_ci    /// Typically caused by writing to `stderr` or `stdout`.
30919625d8cSopenharmony_ci    ///
31019625d8cSopenharmony_ci    /// [`Display`]: std::fmt::Display
31119625d8cSopenharmony_ci    /// [Format error]: std::fmt::Error
31219625d8cSopenharmony_ci    Format,
31319625d8cSopenharmony_ci}
31419625d8cSopenharmony_ci
31519625d8cSopenharmony_ciimpl ErrorKind {
31619625d8cSopenharmony_ci    /// End-user description of the error case, where relevant
31719625d8cSopenharmony_ci    pub fn as_str(self) -> Option<&'static str> {
31819625d8cSopenharmony_ci        match self {
31919625d8cSopenharmony_ci            Self::InvalidValue => Some("one of the values isn't valid for an argument"),
32019625d8cSopenharmony_ci            Self::UnknownArgument => Some("unexpected argument found"),
32119625d8cSopenharmony_ci            Self::InvalidSubcommand => Some("unrecognized subcommand"),
32219625d8cSopenharmony_ci            Self::NoEquals => Some("equal is needed when assigning values to one of the arguments"),
32319625d8cSopenharmony_ci            Self::ValueValidation => Some("invalid value for one of the arguments"),
32419625d8cSopenharmony_ci            Self::TooManyValues => Some("unexpected value for an argument found"),
32519625d8cSopenharmony_ci            Self::TooFewValues => Some("more values required for an argument"),
32619625d8cSopenharmony_ci            Self::WrongNumberOfValues => Some("too many or too few values for an argument"),
32719625d8cSopenharmony_ci            Self::ArgumentConflict => {
32819625d8cSopenharmony_ci                Some("an argument cannot be used with one or more of the other specified arguments")
32919625d8cSopenharmony_ci            }
33019625d8cSopenharmony_ci            Self::MissingRequiredArgument => {
33119625d8cSopenharmony_ci                Some("one or more required arguments were not provided")
33219625d8cSopenharmony_ci            }
33319625d8cSopenharmony_ci            Self::MissingSubcommand => Some("a subcommand is required but one was not provided"),
33419625d8cSopenharmony_ci            Self::InvalidUtf8 => Some("invalid UTF-8 was detected in one or more arguments"),
33519625d8cSopenharmony_ci            Self::DisplayHelp => None,
33619625d8cSopenharmony_ci            Self::DisplayHelpOnMissingArgumentOrSubcommand => None,
33719625d8cSopenharmony_ci            Self::DisplayVersion => None,
33819625d8cSopenharmony_ci            Self::Io => None,
33919625d8cSopenharmony_ci            Self::Format => None,
34019625d8cSopenharmony_ci        }
34119625d8cSopenharmony_ci    }
34219625d8cSopenharmony_ci}
34319625d8cSopenharmony_ci
34419625d8cSopenharmony_ciimpl std::fmt::Display for ErrorKind {
34519625d8cSopenharmony_ci    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34619625d8cSopenharmony_ci        self.as_str().unwrap_or_default().fmt(f)
34719625d8cSopenharmony_ci    }
34819625d8cSopenharmony_ci}
349