aboutsummaryrefslogtreecommitdiff
path: root/clap/src/app/settings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'clap/src/app/settings.rs')
-rw-r--r--clap/src/app/settings.rs1174
1 files changed, 1174 insertions, 0 deletions
diff --git a/clap/src/app/settings.rs b/clap/src/app/settings.rs
new file mode 100644
index 0000000..ec03997
--- /dev/null
+++ b/clap/src/app/settings.rs
@@ -0,0 +1,1174 @@
+// Std
+#[allow(deprecated, unused_imports)]
+use std::ascii::AsciiExt;
+use std::str::FromStr;
+use std::ops::BitOr;
+
+bitflags! {
+ struct Flags: u64 {
+ const SC_NEGATE_REQS = 1;
+ const SC_REQUIRED = 1 << 1;
+ const A_REQUIRED_ELSE_HELP = 1 << 2;
+ const GLOBAL_VERSION = 1 << 3;
+ const VERSIONLESS_SC = 1 << 4;
+ const UNIFIED_HELP = 1 << 5;
+ const WAIT_ON_ERROR = 1 << 6;
+ const SC_REQUIRED_ELSE_HELP= 1 << 7;
+ const NEEDS_LONG_HELP = 1 << 8;
+ const NEEDS_LONG_VERSION = 1 << 9;
+ const NEEDS_SC_HELP = 1 << 10;
+ const DISABLE_VERSION = 1 << 11;
+ const HIDDEN = 1 << 12;
+ const TRAILING_VARARG = 1 << 13;
+ const NO_BIN_NAME = 1 << 14;
+ const ALLOW_UNK_SC = 1 << 15;
+ const UTF8_STRICT = 1 << 16;
+ const UTF8_NONE = 1 << 17;
+ const LEADING_HYPHEN = 1 << 18;
+ const NO_POS_VALUES = 1 << 19;
+ const NEXT_LINE_HELP = 1 << 20;
+ const DERIVE_DISP_ORDER = 1 << 21;
+ const COLORED_HELP = 1 << 22;
+ const COLOR_ALWAYS = 1 << 23;
+ const COLOR_AUTO = 1 << 24;
+ const COLOR_NEVER = 1 << 25;
+ const DONT_DELIM_TRAIL = 1 << 26;
+ const ALLOW_NEG_NUMS = 1 << 27;
+ const LOW_INDEX_MUL_POS = 1 << 28;
+ const DISABLE_HELP_SC = 1 << 29;
+ const DONT_COLLAPSE_ARGS = 1 << 30;
+ const ARGS_NEGATE_SCS = 1 << 31;
+ const PROPAGATE_VALS_DOWN = 1 << 32;
+ const ALLOW_MISSING_POS = 1 << 33;
+ const TRAILING_VALUES = 1 << 34;
+ const VALID_NEG_NUM_FOUND = 1 << 35;
+ const PROPAGATED = 1 << 36;
+ const VALID_ARG_FOUND = 1 << 37;
+ const INFER_SUBCOMMANDS = 1 << 38;
+ const CONTAINS_LAST = 1 << 39;
+ const ARGS_OVERRIDE_SELF = 1 << 40;
+ const DISABLE_HELP_FLAGS = 1 << 41;
+ }
+}
+
+#[doc(hidden)]
+#[derive(Debug, Copy, Clone, PartialEq)]
+pub struct AppFlags(Flags);
+
+impl BitOr for AppFlags {
+ type Output = Self;
+ fn bitor(self, rhs: Self) -> Self { AppFlags(self.0 | rhs.0) }
+}
+
+impl Default for AppFlags {
+ fn default() -> Self {
+ AppFlags(
+ Flags::NEEDS_LONG_VERSION | Flags::NEEDS_LONG_HELP | Flags::NEEDS_SC_HELP
+ | Flags::UTF8_NONE | Flags::COLOR_AUTO,
+ )
+ }
+}
+
+#[allow(deprecated)]
+impl AppFlags {
+ pub fn new() -> Self { AppFlags::default() }
+ pub fn zeroed() -> Self { AppFlags(Flags::empty()) }
+
+ impl_settings! { AppSettings,
+ ArgRequiredElseHelp => Flags::A_REQUIRED_ELSE_HELP,
+ ArgsNegateSubcommands => Flags::ARGS_NEGATE_SCS,
+ AllArgsOverrideSelf => Flags::ARGS_OVERRIDE_SELF,
+ AllowExternalSubcommands => Flags::ALLOW_UNK_SC,
+ AllowInvalidUtf8 => Flags::UTF8_NONE,
+ AllowLeadingHyphen => Flags::LEADING_HYPHEN,
+ AllowNegativeNumbers => Flags::ALLOW_NEG_NUMS,
+ AllowMissingPositional => Flags::ALLOW_MISSING_POS,
+ ColoredHelp => Flags::COLORED_HELP,
+ ColorAlways => Flags::COLOR_ALWAYS,
+ ColorAuto => Flags::COLOR_AUTO,
+ ColorNever => Flags::COLOR_NEVER,
+ DontDelimitTrailingValues => Flags::DONT_DELIM_TRAIL,
+ DontCollapseArgsInUsage => Flags::DONT_COLLAPSE_ARGS,
+ DeriveDisplayOrder => Flags::DERIVE_DISP_ORDER,
+ DisableHelpFlags => Flags::DISABLE_HELP_FLAGS,
+ DisableHelpSubcommand => Flags::DISABLE_HELP_SC,
+ DisableVersion => Flags::DISABLE_VERSION,
+ GlobalVersion => Flags::GLOBAL_VERSION,
+ HidePossibleValuesInHelp => Flags::NO_POS_VALUES,
+ Hidden => Flags::HIDDEN,
+ LowIndexMultiplePositional => Flags::LOW_INDEX_MUL_POS,
+ NeedsLongHelp => Flags::NEEDS_LONG_HELP,
+ NeedsLongVersion => Flags::NEEDS_LONG_VERSION,
+ NeedsSubcommandHelp => Flags::NEEDS_SC_HELP,
+ NoBinaryName => Flags::NO_BIN_NAME,
+ PropagateGlobalValuesDown=> Flags::PROPAGATE_VALS_DOWN,
+ StrictUtf8 => Flags::UTF8_STRICT,
+ SubcommandsNegateReqs => Flags::SC_NEGATE_REQS,
+ SubcommandRequired => Flags::SC_REQUIRED,
+ SubcommandRequiredElseHelp => Flags::SC_REQUIRED_ELSE_HELP,
+ TrailingVarArg => Flags::TRAILING_VARARG,
+ UnifiedHelpMessage => Flags::UNIFIED_HELP,
+ NextLineHelp => Flags::NEXT_LINE_HELP,
+ VersionlessSubcommands => Flags::VERSIONLESS_SC,
+ WaitOnError => Flags::WAIT_ON_ERROR,
+ TrailingValues => Flags::TRAILING_VALUES,
+ ValidNegNumFound => Flags::VALID_NEG_NUM_FOUND,
+ Propagated => Flags::PROPAGATED,
+ ValidArgFound => Flags::VALID_ARG_FOUND,
+ InferSubcommands => Flags::INFER_SUBCOMMANDS,
+ ContainsLast => Flags::CONTAINS_LAST
+ }
+}
+
+/// Application level settings, which affect how [`App`] operates
+///
+/// **NOTE:** When these settings are used, they apply only to current command, and are *not*
+/// propagated down or up through child or parent subcommands
+///
+/// [`App`]: ./struct.App.html
+#[derive(Debug, PartialEq, Copy, Clone)]
+pub enum AppSettings {
+ /// Specifies that any invalid UTF-8 code points should *not* be treated as an error.
+ /// This is the default behavior of `clap`.
+ ///
+ /// **NOTE:** Using argument values with invalid UTF-8 code points requires using
+ /// [`ArgMatches::os_value_of`], [`ArgMatches::os_values_of`], [`ArgMatches::lossy_value_of`],
+ /// or [`ArgMatches::lossy_values_of`] for those particular arguments which may contain invalid
+ /// UTF-8 values
+ ///
+ /// **NOTE:** This rule only applies to argument values, as flags, options, and
+ /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
+ ///
+ /// # Platform Specific
+ ///
+ /// Non Windows systems only
+ ///
+ /// # Examples
+ ///
+ #[cfg_attr(not(unix), doc = " ```ignore")]
+ #[cfg_attr(unix, doc = " ```")]
+ /// # use clap::{App, AppSettings};
+ /// use std::ffi::OsString;
+ /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
+ ///
+ /// let r = App::new("myprog")
+ /// //.setting(AppSettings::AllowInvalidUtf8)
+ /// .arg_from_usage("<arg> 'some positional arg'")
+ /// .get_matches_from_safe(
+ /// vec![
+ /// OsString::from("myprog"),
+ /// OsString::from_vec(vec![0xe9])]);
+ ///
+ /// assert!(r.is_ok());
+ /// let m = r.unwrap();
+ /// assert_eq!(m.value_of_os("arg").unwrap().as_bytes(), &[0xe9]);
+ /// ```
+ /// [`ArgMatches::os_value_of`]: ./struct.ArgMatches.html#method.os_value_of
+ /// [`ArgMatches::os_values_of`]: ./struct.ArgMatches.html#method.os_values_of
+ /// [`ArgMatches::lossy_value_of`]: ./struct.ArgMatches.html#method.lossy_value_of
+ /// [`ArgMatches::lossy_values_of`]: ./struct.ArgMatches.html#method.lossy_values_of
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ AllowInvalidUtf8,
+
+ /// Essentially sets [`Arg::overrides_with("itself")`] for all arguments.
+ ///
+ /// **WARNING:** Positional arguments cannot override themselves (or we would never be able
+ /// to advance to the next positional). This setting ignores positional arguments.
+ /// [`Arg::overrides_with("itself")`]: ./struct.Arg.html#method.overrides_with
+ AllArgsOverrideSelf,
+
+ /// Specifies that leading hyphens are allowed in argument *values*, such as negative numbers
+ /// like `-10`. (which would otherwise be parsed as another flag or option)
+ ///
+ /// **NOTE:** Use this setting with caution as it silences certain circumstances which would
+ /// otherwise be an error (such as accidentally forgetting to specify a value for leading
+ /// option). It is preferred to set this on a per argument basis, via [`Arg::allow_hyphen_values`]
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{Arg, App, AppSettings};
+ /// // Imagine you needed to represent negative numbers as well, such as -10
+ /// let m = App::new("nums")
+ /// .setting(AppSettings::AllowLeadingHyphen)
+ /// .arg(Arg::with_name("neg").index(1))
+ /// .get_matches_from(vec![
+ /// "nums", "-20"
+ /// ]);
+ ///
+ /// assert_eq!(m.value_of("neg"), Some("-20"));
+ /// # ;
+ /// ```
+ /// [`Arg::allow_hyphen_values`]: ./struct.Arg.html#method.allow_hyphen_values
+ AllowLeadingHyphen,
+
+ /// Allows negative numbers to pass as values. This is similar to
+ /// `AllowLeadingHyphen` except that it only allows numbers, all
+ /// other undefined leading hyphens will fail to parse.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// let res = App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::AllowNegativeNumbers)
+ /// .arg(Arg::with_name("num"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "-20"
+ /// ]);
+ /// assert!(res.is_ok());
+ /// let m = res.unwrap();
+ /// assert_eq!(m.value_of("num").unwrap(), "-20");
+ /// ```
+ /// [`AllowLeadingHyphen`]: ./enum.AppSettings.html#variant.AllowLeadingHyphen
+ AllowNegativeNumbers,
+
+ /// Allows one to implement two styles of CLIs where positionals can be used out of order.
+ ///
+ /// The first example is a CLI where the second to last positional argument is optional, but
+ /// the final positional argument is required. Such as `$ prog [optional] <required>` where one
+ /// of the two following usages is allowed:
+ ///
+ /// * `$ prog [optional] <required>`
+ /// * `$ prog <required>`
+ ///
+ /// This would otherwise not be allowed. This is useful when `[optional]` has a default value.
+ ///
+ /// **Note:** when using this style of "missing positionals" the final positional *must* be
+ /// [required] if `--` will not be used to skip to the final positional argument.
+ ///
+ /// **Note:** This style also only allows a single positional argument to be "skipped" without
+ /// the use of `--`. To skip more than one, see the second example.
+ ///
+ /// The second example is when one wants to skip multiple optional positional arguments, and use
+ /// of the `--` operator is OK (but not required if all arguments will be specified anyways).
+ ///
+ /// For example, imagine a CLI which has three positional arguments `[foo] [bar] [baz]...` where
+ /// `baz` accepts multiple values (similar to man `ARGS...` style training arguments).
+ ///
+ /// With this setting the following invocations are possible:
+ ///
+ /// * `$ prog foo bar baz1 baz2 baz3`
+ /// * `$ prog foo -- baz1 baz2 baz3`
+ /// * `$ prog -- baz1 baz2 baz3`
+ ///
+ /// # Examples
+ ///
+ /// Style number one from above:
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// // Assume there is an external subcommand named "subcmd"
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::AllowMissingPositional)
+ /// .arg(Arg::with_name("arg1"))
+ /// .arg(Arg::with_name("arg2")
+ /// .required(true))
+ /// .get_matches_from(vec![
+ /// "prog", "other"
+ /// ]);
+ ///
+ /// assert_eq!(m.value_of("arg1"), None);
+ /// assert_eq!(m.value_of("arg2"), Some("other"));
+ /// ```
+ ///
+ /// Now the same example, but using a default value for the first optional positional argument
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// // Assume there is an external subcommand named "subcmd"
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::AllowMissingPositional)
+ /// .arg(Arg::with_name("arg1")
+ /// .default_value("something"))
+ /// .arg(Arg::with_name("arg2")
+ /// .required(true))
+ /// .get_matches_from(vec![
+ /// "prog", "other"
+ /// ]);
+ ///
+ /// assert_eq!(m.value_of("arg1"), Some("something"));
+ /// assert_eq!(m.value_of("arg2"), Some("other"));
+ /// ```
+ /// Style number two from above:
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// // Assume there is an external subcommand named "subcmd"
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::AllowMissingPositional)
+ /// .arg(Arg::with_name("foo"))
+ /// .arg(Arg::with_name("bar"))
+ /// .arg(Arg::with_name("baz").multiple(true))
+ /// .get_matches_from(vec![
+ /// "prog", "foo", "bar", "baz1", "baz2", "baz3"
+ /// ]);
+ ///
+ /// assert_eq!(m.value_of("foo"), Some("foo"));
+ /// assert_eq!(m.value_of("bar"), Some("bar"));
+ /// assert_eq!(m.values_of("baz").unwrap().collect::<Vec<_>>(), &["baz1", "baz2", "baz3"]);
+ /// ```
+ ///
+ /// Now notice if we don't specify `foo` or `baz` but use the `--` operator.
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// // Assume there is an external subcommand named "subcmd"
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::AllowMissingPositional)
+ /// .arg(Arg::with_name("foo"))
+ /// .arg(Arg::with_name("bar"))
+ /// .arg(Arg::with_name("baz").multiple(true))
+ /// .get_matches_from(vec![
+ /// "prog", "--", "baz1", "baz2", "baz3"
+ /// ]);
+ ///
+ /// assert_eq!(m.value_of("foo"), None);
+ /// assert_eq!(m.value_of("bar"), None);
+ /// assert_eq!(m.values_of("baz").unwrap().collect::<Vec<_>>(), &["baz1", "baz2", "baz3"]);
+ /// ```
+ /// [required]: ./struct.Arg.html#method.required
+ AllowMissingPositional,
+
+ /// Specifies that an unexpected positional argument,
+ /// which would otherwise cause a [`ErrorKind::UnknownArgument`] error,
+ /// should instead be treated as a [`SubCommand`] within the [`ArgMatches`] struct.
+ ///
+ /// **NOTE:** Use this setting with caution,
+ /// as a truly unexpected argument (i.e. one that is *NOT* an external subcommand)
+ /// will **not** cause an error and instead be treated as a potential subcommand.
+ /// One should check for such cases manually and inform the user appropriately.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings};
+ /// // Assume there is an external subcommand named "subcmd"
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::AllowExternalSubcommands)
+ /// .get_matches_from(vec![
+ /// "myprog", "subcmd", "--option", "value", "-fff", "--flag"
+ /// ]);
+ ///
+ /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
+ /// // string argument name
+ /// match m.subcommand() {
+ /// (external, Some(ext_m)) => {
+ /// let ext_args: Vec<&str> = ext_m.values_of("").unwrap().collect();
+ /// assert_eq!(external, "subcmd");
+ /// assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
+ /// },
+ /// _ => {},
+ /// }
+ /// ```
+ /// [`ErrorKind::UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`ArgMatches`]: ./struct.ArgMatches.html
+ AllowExternalSubcommands,
+
+ /// Specifies that use of a valid [argument] negates [subcommands] being used after. By default
+ /// `clap` allows arguments between subcommands such as
+ /// `<cmd> [cmd_args] <cmd2> [cmd2_args] <cmd3> [cmd3_args]`. This setting disables that
+ /// functionality and says that arguments can only follow the *final* subcommand. For instance
+ /// using this setting makes only the following invocations possible:
+ ///
+ /// * `<cmd> <cmd2> <cmd3> [cmd3_args]`
+ /// * `<cmd> <cmd2> [cmd2_args]`
+ /// * `<cmd> [cmd_args]`
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ArgsNegateSubcommands)
+ /// # ;
+ /// ```
+ /// [subcommands]: ./struct.SubCommand.html
+ /// [argument]: ./struct.Arg.html
+ ArgsNegateSubcommands,
+
+ /// Specifies that the help text should be displayed (and then exit gracefully),
+ /// if no arguments are present at runtime (i.e. an empty run such as, `$ myprog`.
+ ///
+ /// **NOTE:** [`SubCommand`]s count as arguments
+ ///
+ /// **NOTE:** Setting [`Arg::default_value`] effectively disables this option as it will
+ /// ensure that some argument is always present.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ArgRequiredElseHelp)
+ /// # ;
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
+ ArgRequiredElseHelp,
+
+ /// Uses colorized help messages.
+ ///
+ /// **NOTE:** Must be compiled with the `color` cargo feature
+ ///
+ /// # Platform Specific
+ ///
+ /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms)
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ColoredHelp)
+ /// .get_matches();
+ /// ```
+ ColoredHelp,
+
+ /// Enables colored output only when the output is going to a terminal or TTY.
+ ///
+ /// **NOTE:** This is the default behavior of `clap`.
+ ///
+ /// **NOTE:** Must be compiled with the `color` cargo feature.
+ ///
+ /// # Platform Specific
+ ///
+ /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms).
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ColorAuto)
+ /// .get_matches();
+ /// ```
+ ColorAuto,
+
+ /// Enables colored output regardless of whether or not the output is going to a terminal/TTY.
+ ///
+ /// **NOTE:** Must be compiled with the `color` cargo feature.
+ ///
+ /// # Platform Specific
+ ///
+ /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms).
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ColorAlways)
+ /// .get_matches();
+ /// ```
+ ColorAlways,
+
+ /// Disables colored output no matter if the output is going to a terminal/TTY, or not.
+ ///
+ /// **NOTE:** Must be compiled with the `color` cargo feature
+ ///
+ /// # Platform Specific
+ ///
+ /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms)
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::ColorNever)
+ /// .get_matches();
+ /// ```
+ ColorNever,
+
+ /// Disables the automatic collapsing of positional args into `[ARGS]` inside the usage string
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::DontCollapseArgsInUsage)
+ /// .get_matches();
+ /// ```
+ DontCollapseArgsInUsage,
+
+ /// Disables the automatic delimiting of values when `--` or [`AppSettings::TrailingVarArg`]
+ /// was used.
+ ///
+ /// **NOTE:** The same thing can be done manually by setting the final positional argument to
+ /// [`Arg::use_delimiter(false)`]. Using this setting is safer, because it's easier to locate
+ /// when making changes.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::DontDelimitTrailingValues)
+ /// .get_matches();
+ /// ```
+ /// [`AppSettings::TrailingVarArg`]: ./enum.AppSettings.html#variant.TrailingVarArg
+ /// [`Arg::use_delimiter(false)`]: ./struct.Arg.html#method.use_delimiter
+ DontDelimitTrailingValues,
+
+ /// Disables `-h` and `--help` [`App`] without affecting any of the [`SubCommand`]s
+ /// (Defaults to `false`; application *does* have help flags)
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings, ErrorKind};
+ /// let res = App::new("myprog")
+ /// .setting(AppSettings::DisableHelpFlags)
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "-h"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
+ /// ```
+ ///
+ /// ```rust
+ /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
+ /// let res = App::new("myprog")
+ /// .setting(AppSettings::DisableHelpFlags)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "test", "-h"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::HelpDisplayed);
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`App`]: ./struct.App.html
+ DisableHelpFlags,
+
+ /// Disables the `help` subcommand
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings, ErrorKind, SubCommand};
+ /// let res = App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::DisableHelpSubcommand)
+ /// // Normally, creating a subcommand causes a `help` subcommand to automatically
+ /// // be generated as well
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "help"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ DisableHelpSubcommand,
+
+ /// Disables `-V` and `--version` [`App`] without affecting any of the [`SubCommand`]s
+ /// (Defaults to `false`; application *does* have a version flag)
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings, ErrorKind};
+ /// let res = App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::DisableVersion)
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "-V"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
+ /// ```
+ ///
+ /// ```rust
+ /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
+ /// let res = App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::DisableVersion)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "test", "-V"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::VersionDisplayed);
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`App`]: ./struct.App.html
+ DisableVersion,
+
+ /// Displays the arguments and [`SubCommand`]s in the help message in the order that they were
+ /// declared in, and not alphabetically which is the default.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::DeriveDisplayOrder)
+ /// .get_matches();
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ DeriveDisplayOrder,
+
+ /// Specifies to use the version of the current command for all child [`SubCommand`]s.
+ /// (Defaults to `false`; subcommands have independent version strings from their parents.)
+ ///
+ /// **NOTE:** The version for the current command **and** this setting must be set **prior** to
+ /// adding any child subcommands
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::GlobalVersion)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches();
+ /// // running `$ myprog test --version` will display
+ /// // "myprog-test v1.1"
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ GlobalVersion,
+
+ /// Specifies that this [`SubCommand`] should be hidden from help messages
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings, SubCommand};
+ /// App::new("myprog")
+ /// .subcommand(SubCommand::with_name("test")
+ /// .setting(AppSettings::Hidden))
+ /// # ;
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ Hidden,
+
+ /// Tells `clap` *not* to print possible values when displaying help information.
+ /// This can be useful if there are many values, or they are explained elsewhere.
+ HidePossibleValuesInHelp,
+
+ /// Tries to match unknown args to partial [`subcommands`] or their [aliases]. For example to
+ /// match a subcommand named `test`, one could use `t`, `te`, `tes`, and `test`.
+ ///
+ /// **NOTE:** The match *must not* be ambiguous at all in order to succeed. i.e. to match `te`
+ /// to `test` there could not also be a subcommand or alias `temp` because both start with `te`
+ ///
+ /// **CAUTION:** This setting can interfere with [positional/free arguments], take care when
+ /// designing CLIs which allow inferred subcommands and have potential positional/free
+ /// arguments whose values could start with the same characters as subcommands. If this is the
+ /// case, it's recommended to use settings such as [`AppSeettings::ArgsNegateSubcommands`] in
+ /// conjunction with this setting.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// let m = App::new("prog")
+ /// .setting(AppSettings::InferSubcommands)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from(vec![
+ /// "prog", "te"
+ /// ]);
+ /// assert_eq!(m.subcommand_name(), Some("test"));
+ /// ```
+ /// [`subcommands`]: ./struct.SubCommand.html
+ /// [positional/free arguments]: ./struct.Arg.html#method.index
+ /// [aliases]: ./struct.App.html#method.alias
+ /// [`AppSeettings::ArgsNegateSubcommands`]: ./enum.AppSettings.html#variant.ArgsNegateSubcommands
+ InferSubcommands,
+
+ /// Specifies that the parser should not assume the first argument passed is the binary name.
+ /// This is normally the case when using a "daemon" style mode, or an interactive CLI where one
+ /// one would not normally type the binary or program name for each command.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::NoBinaryName)
+ /// .arg(Arg::from_usage("<cmd>... 'commands to run'"))
+ /// .get_matches_from(vec!["command", "set"]);
+ ///
+ /// let cmds: Vec<&str> = m.values_of("cmd").unwrap().collect();
+ /// assert_eq!(cmds, ["command", "set"]);
+ /// ```
+ NoBinaryName,
+
+ /// Places the help string for all arguments on the line after the argument.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::NextLineHelp)
+ /// .get_matches();
+ /// ```
+ NextLineHelp,
+
+ /// **DEPRECATED**: This setting is no longer required in order to propagate values up or down
+ ///
+ /// Specifies that the parser should propagate global arg's values down or up through any *used*
+ /// child subcommands. Meaning, if a subcommand wasn't used, the values won't be propagated to
+ /// said subcommand.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings, SubCommand};
+ /// let m = App::new("myprog")
+ /// .arg(Arg::from_usage("[cmd] 'command to run'")
+ /// .global(true))
+ /// .subcommand(SubCommand::with_name("foo"))
+ /// .get_matches_from(vec!["myprog", "set", "foo"]);
+ ///
+ /// assert_eq!(m.value_of("cmd"), Some("set"));
+ ///
+ /// let sub_m = m.subcommand_matches("foo").unwrap();
+ /// assert_eq!(sub_m.value_of("cmd"), Some("set"));
+ /// ```
+ /// Now doing the same thing, but *not* using any subcommands will result in the value not being
+ /// propagated down.
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings, SubCommand};
+ /// let m = App::new("myprog")
+ /// .arg(Arg::from_usage("[cmd] 'command to run'")
+ /// .global(true))
+ /// .subcommand(SubCommand::with_name("foo"))
+ /// .get_matches_from(vec!["myprog", "set"]);
+ ///
+ /// assert_eq!(m.value_of("cmd"), Some("set"));
+ ///
+ /// assert!(m.subcommand_matches("foo").is_none());
+ /// ```
+ #[deprecated(since = "2.27.0", note = "No longer required to propagate values")]
+ PropagateGlobalValuesDown,
+
+ /// Allows [`SubCommand`]s to override all requirements of the parent command.
+ /// For example if you had a subcommand or top level application with a required argument
+ /// that is only required as long as there is no subcommand present,
+ /// using this setting would allow you to set those arguments to [`Arg::required(true)`]
+ /// and yet receive no error so long as the user uses a valid subcommand instead.
+ ///
+ /// **NOTE:** This defaults to false (using subcommand does *not* negate requirements)
+ ///
+ /// # Examples
+ ///
+ /// This first example shows that it is an error to not use a required argument
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
+ /// let err = App::new("myprog")
+ /// .setting(AppSettings::SubcommandsNegateReqs)
+ /// .arg(Arg::with_name("opt").required(true))
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog"
+ /// ]);
+ /// assert!(err.is_err());
+ /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
+ /// # ;
+ /// ```
+ ///
+ /// This next example shows that it is no longer error to not use a required argument if a
+ /// valid subcommand is used.
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
+ /// let noerr = App::new("myprog")
+ /// .setting(AppSettings::SubcommandsNegateReqs)
+ /// .arg(Arg::with_name("opt").required(true))
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "test"
+ /// ]);
+ /// assert!(noerr.is_ok());
+ /// # ;
+ /// ```
+ /// [`Arg::required(true)`]: ./struct.Arg.html#method.required
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ SubcommandsNegateReqs,
+
+ /// Specifies that the help text should be displayed (before exiting gracefully) if no
+ /// [`SubCommand`]s are present at runtime (i.e. an empty run such as `$ myprog`).
+ ///
+ /// **NOTE:** This should *not* be used with [`AppSettings::SubcommandRequired`] as they do
+ /// nearly same thing; this prints the help text, and the other prints an error.
+ ///
+ /// **NOTE:** If the user specifies arguments at runtime, but no subcommand the help text will
+ /// still be displayed and exit. If this is *not* the desired result, consider using
+ /// [`AppSettings::ArgRequiredElseHelp`] instead.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::SubcommandRequiredElseHelp)
+ /// # ;
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`AppSettings::SubcommandRequired`]: ./enum.AppSettings.html#variant.SubcommandRequired
+ /// [`AppSettings::ArgRequiredElseHelp`]: ./enum.AppSettings.html#variant.ArgRequiredElseHelp
+ SubcommandRequiredElseHelp,
+
+ /// Specifies that any invalid UTF-8 code points should be treated as an error and fail
+ /// with a [`ErrorKind::InvalidUtf8`] error.
+ ///
+ /// **NOTE:** This rule only applies to argument values; Things such as flags, options, and
+ /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
+ ///
+ /// # Platform Specific
+ ///
+ /// Non Windows systems only
+ ///
+ /// # Examples
+ ///
+ #[cfg_attr(not(unix), doc = " ```ignore")]
+ #[cfg_attr(unix, doc = " ```")]
+ /// # use clap::{App, AppSettings, ErrorKind};
+ /// use std::ffi::OsString;
+ /// use std::os::unix::ffi::OsStringExt;
+ ///
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::StrictUtf8)
+ /// .arg_from_usage("<arg> 'some positional arg'")
+ /// .get_matches_from_safe(
+ /// vec![
+ /// OsString::from("myprog"),
+ /// OsString::from_vec(vec![0xe9])]);
+ ///
+ /// assert!(m.is_err());
+ /// assert_eq!(m.unwrap_err().kind, ErrorKind::InvalidUtf8);
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ /// [`ErrorKind::InvalidUtf8`]: ./enum.ErrorKind.html#variant.InvalidUtf8
+ StrictUtf8,
+
+ /// Allows specifying that if no [`SubCommand`] is present at runtime,
+ /// error and exit gracefully.
+ ///
+ /// **NOTE:** This defaults to `false` (subcommands do *not* need to be present)
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, AppSettings, SubCommand, ErrorKind};
+ /// let err = App::new("myprog")
+ /// .setting(AppSettings::SubcommandRequired)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog",
+ /// ]);
+ /// assert!(err.is_err());
+ /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingSubcommand);
+ /// # ;
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ SubcommandRequired,
+
+ /// Specifies that the final positional argument is a "VarArg" and that `clap` should not
+ /// attempt to parse any further args.
+ ///
+ /// The values of the trailing positional argument will contain all args from itself on.
+ ///
+ /// **NOTE:** The final positional argument **must** have [`Arg::multiple(true)`] or the usage
+ /// string equivalent.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// let m = App::new("myprog")
+ /// .setting(AppSettings::TrailingVarArg)
+ /// .arg(Arg::from_usage("<cmd>... 'commands to run'"))
+ /// .get_matches_from(vec!["myprog", "arg1", "-r", "val1"]);
+ ///
+ /// let trail: Vec<&str> = m.values_of("cmd").unwrap().collect();
+ /// assert_eq!(trail, ["arg1", "-r", "val1"]);
+ /// ```
+ /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
+ TrailingVarArg,
+
+ /// Groups flags and options together, presenting a more unified help message
+ /// (a la `getopts` or `docopt` style).
+ ///
+ /// The default is that the auto-generated help message will group flags, and options
+ /// separately.
+ ///
+ /// **NOTE:** This setting is cosmetic only and does not affect any functionality.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// # use clap::{App, Arg, SubCommand, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::UnifiedHelpMessage)
+ /// .get_matches();
+ /// // running `myprog --help` will display a unified "docopt" or "getopts" style help message
+ /// ```
+ UnifiedHelpMessage,
+
+ /// Disables `-V` and `--version` for all [`SubCommand`]s
+ /// (Defaults to `false`; subcommands *do* have version flags.)
+ ///
+ /// **NOTE:** This setting must be set **prior** to adding any subcommands.
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
+ /// let res = App::new("myprog")
+ /// .version("v1.1")
+ /// .setting(AppSettings::VersionlessSubcommands)
+ /// .subcommand(SubCommand::with_name("test"))
+ /// .get_matches_from_safe(vec![
+ /// "myprog", "test", "-V"
+ /// ]);
+ /// assert!(res.is_err());
+ /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ VersionlessSubcommands,
+
+ /// Will display a message "Press \[ENTER\]/\[RETURN\] to continue..." and wait for user before
+ /// exiting
+ ///
+ /// This is most useful when writing an application which is run from a GUI shortcut, or on
+ /// Windows where a user tries to open the binary by double-clicking instead of using the
+ /// command line.
+ ///
+ /// **NOTE:** This setting is **not** recursive with [`SubCommand`]s, meaning if you wish this
+ /// behavior for all subcommands, you must set this on each command (needing this is extremely
+ /// rare)
+ ///
+ /// # Examples
+ ///
+ /// ```rust
+ /// # use clap::{App, Arg, AppSettings};
+ /// App::new("myprog")
+ /// .setting(AppSettings::WaitOnError)
+ /// # ;
+ /// ```
+ /// [`SubCommand`]: ./struct.SubCommand.html
+ WaitOnError,
+
+ #[doc(hidden)] NeedsLongVersion,
+
+ #[doc(hidden)] NeedsLongHelp,
+
+ #[doc(hidden)] NeedsSubcommandHelp,
+
+ #[doc(hidden)] LowIndexMultiplePositional,
+
+ #[doc(hidden)] TrailingValues,
+
+ #[doc(hidden)] ValidNegNumFound,
+
+ #[doc(hidden)] Propagated,
+
+ #[doc(hidden)] ValidArgFound,
+
+ #[doc(hidden)] ContainsLast,
+}
+
+impl FromStr for AppSettings {
+ type Err = String;
+ fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
+ match &*s.to_ascii_lowercase() {
+ "disablehelpflags" => Ok(AppSettings::DisableHelpFlags),
+ "argrequiredelsehelp" => Ok(AppSettings::ArgRequiredElseHelp),
+ "argsnegatesubcommands" => Ok(AppSettings::ArgsNegateSubcommands),
+ "allowinvalidutf8" => Ok(AppSettings::AllowInvalidUtf8),
+ "allowleadinghyphen" => Ok(AppSettings::AllowLeadingHyphen),
+ "allowexternalsubcommands" => Ok(AppSettings::AllowExternalSubcommands),
+ "allownegativenumbers" => Ok(AppSettings::AllowNegativeNumbers),
+ "colorauto" => Ok(AppSettings::ColorAuto),
+ "coloralways" => Ok(AppSettings::ColorAlways),
+ "colornever" => Ok(AppSettings::ColorNever),
+ "coloredhelp" => Ok(AppSettings::ColoredHelp),
+ "derivedisplayorder" => Ok(AppSettings::DeriveDisplayOrder),
+ "dontcollapseargsinusage" => Ok(AppSettings::DontCollapseArgsInUsage),
+ "dontdelimittrailingvalues" => Ok(AppSettings::DontDelimitTrailingValues),
+ "disablehelpsubcommand" => Ok(AppSettings::DisableHelpSubcommand),
+ "disableversion" => Ok(AppSettings::DisableVersion),
+ "globalversion" => Ok(AppSettings::GlobalVersion),
+ "hidden" => Ok(AppSettings::Hidden),
+ "hidepossiblevaluesinhelp" => Ok(AppSettings::HidePossibleValuesInHelp),
+ "infersubcommands" => Ok(AppSettings::InferSubcommands),
+ "lowindexmultiplepositional" => Ok(AppSettings::LowIndexMultiplePositional),
+ "nobinaryname" => Ok(AppSettings::NoBinaryName),
+ "nextlinehelp" => Ok(AppSettings::NextLineHelp),
+ "strictutf8" => Ok(AppSettings::StrictUtf8),
+ "subcommandsnegatereqs" => Ok(AppSettings::SubcommandsNegateReqs),
+ "subcommandrequired" => Ok(AppSettings::SubcommandRequired),
+ "subcommandrequiredelsehelp" => Ok(AppSettings::SubcommandRequiredElseHelp),
+ "trailingvararg" => Ok(AppSettings::TrailingVarArg),
+ "unifiedhelpmessage" => Ok(AppSettings::UnifiedHelpMessage),
+ "versionlesssubcommands" => Ok(AppSettings::VersionlessSubcommands),
+ "waitonerror" => Ok(AppSettings::WaitOnError),
+ "validnegnumfound" => Ok(AppSettings::ValidNegNumFound),
+ "validargfound" => Ok(AppSettings::ValidArgFound),
+ "propagated" => Ok(AppSettings::Propagated),
+ "trailingvalues" => Ok(AppSettings::TrailingValues),
+ _ => Err("unknown AppSetting, cannot convert from str".to_owned()),
+ }
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::AppSettings;
+
+ #[test]
+ fn app_settings_fromstr() {
+ assert_eq!(
+ "disablehelpflags".parse::<AppSettings>().unwrap(),
+ AppSettings::DisableHelpFlags
+ );
+ assert_eq!(
+ "argsnegatesubcommands".parse::<AppSettings>().unwrap(),
+ AppSettings::ArgsNegateSubcommands
+ );
+ assert_eq!(
+ "argrequiredelsehelp".parse::<AppSettings>().unwrap(),
+ AppSettings::ArgRequiredElseHelp
+ );
+ assert_eq!(
+ "allowexternalsubcommands".parse::<AppSettings>().unwrap(),
+ AppSettings::AllowExternalSubcommands
+ );
+ assert_eq!(
+ "allowinvalidutf8".parse::<AppSettings>().unwrap(),
+ AppSettings::AllowInvalidUtf8
+ );
+ assert_eq!(
+ "allowleadinghyphen".parse::<AppSettings>().unwrap(),
+ AppSettings::AllowLeadingHyphen
+ );
+ assert_eq!(
+ "allownegativenumbers".parse::<AppSettings>().unwrap(),
+ AppSettings::AllowNegativeNumbers
+ );
+ assert_eq!(
+ "coloredhelp".parse::<AppSettings>().unwrap(),
+ AppSettings::ColoredHelp
+ );
+ assert_eq!(
+ "colorauto".parse::<AppSettings>().unwrap(),
+ AppSettings::ColorAuto
+ );
+ assert_eq!(
+ "coloralways".parse::<AppSettings>().unwrap(),
+ AppSettings::ColorAlways
+ );
+ assert_eq!(
+ "colornever".parse::<AppSettings>().unwrap(),
+ AppSettings::ColorNever
+ );
+ assert_eq!(
+ "disablehelpsubcommand".parse::<AppSettings>().unwrap(),
+ AppSettings::DisableHelpSubcommand
+ );
+ assert_eq!(
+ "disableversion".parse::<AppSettings>().unwrap(),
+ AppSettings::DisableVersion
+ );
+ assert_eq!(
+ "dontcollapseargsinusage".parse::<AppSettings>().unwrap(),
+ AppSettings::DontCollapseArgsInUsage
+ );
+ assert_eq!(
+ "dontdelimittrailingvalues".parse::<AppSettings>().unwrap(),
+ AppSettings::DontDelimitTrailingValues
+ );
+ assert_eq!(
+ "derivedisplayorder".parse::<AppSettings>().unwrap(),
+ AppSettings::DeriveDisplayOrder
+ );
+ assert_eq!(
+ "globalversion".parse::<AppSettings>().unwrap(),
+ AppSettings::GlobalVersion
+ );
+ assert_eq!(
+ "hidden".parse::<AppSettings>().unwrap(),
+ AppSettings::Hidden
+ );
+ assert_eq!(
+ "hidepossiblevaluesinhelp".parse::<AppSettings>().unwrap(),
+ AppSettings::HidePossibleValuesInHelp
+ );
+ assert_eq!(
+ "lowindexmultiplePositional".parse::<AppSettings>().unwrap(),
+ AppSettings::LowIndexMultiplePositional
+ );
+ assert_eq!(
+ "nobinaryname".parse::<AppSettings>().unwrap(),
+ AppSettings::NoBinaryName
+ );
+ assert_eq!(
+ "nextlinehelp".parse::<AppSettings>().unwrap(),
+ AppSettings::NextLineHelp
+ );
+ assert_eq!(
+ "subcommandsnegatereqs".parse::<AppSettings>().unwrap(),
+ AppSettings::SubcommandsNegateReqs
+ );
+ assert_eq!(
+ "subcommandrequired".parse::<AppSettings>().unwrap(),
+ AppSettings::SubcommandRequired
+ );
+ assert_eq!(
+ "subcommandrequiredelsehelp".parse::<AppSettings>().unwrap(),
+ AppSettings::SubcommandRequiredElseHelp
+ );
+ assert_eq!(
+ "strictutf8".parse::<AppSettings>().unwrap(),
+ AppSettings::StrictUtf8
+ );
+ assert_eq!(
+ "trailingvararg".parse::<AppSettings>().unwrap(),
+ AppSettings::TrailingVarArg
+ );
+ assert_eq!(
+ "unifiedhelpmessage".parse::<AppSettings>().unwrap(),
+ AppSettings::UnifiedHelpMessage
+ );
+ assert_eq!(
+ "versionlesssubcommands".parse::<AppSettings>().unwrap(),
+ AppSettings::VersionlessSubcommands
+ );
+ assert_eq!(
+ "waitonerror".parse::<AppSettings>().unwrap(),
+ AppSettings::WaitOnError
+ );
+ assert_eq!(
+ "validnegnumfound".parse::<AppSettings>().unwrap(),
+ AppSettings::ValidNegNumFound
+ );
+ assert_eq!(
+ "validargfound".parse::<AppSettings>().unwrap(),
+ AppSettings::ValidArgFound
+ );
+ assert_eq!(
+ "propagated".parse::<AppSettings>().unwrap(),
+ AppSettings::Propagated
+ );
+ assert_eq!(
+ "trailingvalues".parse::<AppSettings>().unwrap(),
+ AppSettings::TrailingValues
+ );
+ assert_eq!(
+ "infersubcommands".parse::<AppSettings>().unwrap(),
+ AppSettings::InferSubcommands
+ );
+ assert!("hahahaha".parse::<AppSettings>().is_err());
+ }
+}