#![allow(deprecated)]
use std::ops::BitOr;
#[cfg(feature = "yaml")]
use std::str::FromStr;
use bitflags::bitflags;
#[allow(unused)]
use crate::Arg;
#[doc(hidden)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ArgFlags(Flags);
impl Default for ArgFlags {
fn default() -> Self {
Self::empty()
}
}
#[derive(Debug, PartialEq, Copy, Clone)]
#[non_exhaustive]
pub enum ArgSettings {
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::required` and `Arg::is_required_set`
Derive: replace `#[clap(setting = Required)]` with `#[clap(required = true)]`
Builder: replace `arg.setting(Required)` with `arg.required(true)`
"
)
)]
Required,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::multiple_values` and `Arg::`is_multiple_values_set`
Derive: replace `#[clap(setting = MultipleValues)]` with `#[clap(multiple_values = true)]`
Builder: replace `arg.setting(MultipleValues)` with `arg.multiple_values(true)`
"
)
)]
MultipleValues,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::action` (Issue #3772)
Builder: replace `arg.setting(MultipleOccurrences)` with `arg.action(ArgAction::Append)` when taking a value and `arg.action(ArgAction::Count)` with `matches.get_count` when not
"
)
)]
MultipleOccurrences,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.0.0",
note = "Split into `Arg::multiple_occurrences` (most likely what you want) and `Arg::multiple_values`
Derive: replace `#[clap(setting = Multiple)]` with `#[clap(multiple_values = true, multiple_occurrences = true)]`
Builder: replace `arg.setting(Multiple)` with `arg.multiple_values(true).multiple_occurrences(true)`
"
)
)]
#[doc(hidden)]
Multiple,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::value_parser(NonEmptyStringValueParser::new())`
Derive: replace `#[clap(setting = ForbidEmptyValues)]` with `#[clap(value_parser = NonEmptyStringValueParser::new())]`
Builder: replace `arg.setting(Multiple)` with `arg.value_parser(NonEmptyStringValueParser::new())`
"
)
)]
ForbidEmptyValues,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::global` and `Arg::is_global_set`
Derive: replace `#[clap(setting = Global)]` with `#[clap(global = true)]`
Builder: replace `arg.setting(Global)` with `arg.global(true)`
"
)
)]
Global,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide` and `Arg::is_hide_set`
Derive: replace `#[clap(setting = Hidden)]` with `#[clap(hide = true)]`
Builder: replace `arg.setting(Hidden)` with `arg.hide(true)`
"
)
)]
Hidden,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::takes_value` and `Arg::is_takes_value_set`
Derive: this setting shouldn't be needed
Builder: replace `arg.setting(TakesValue)` with `arg.takes_value(true)`
"
)
)]
TakesValue,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::use_value_delimiter` and `Arg::is_use_value_delimiter_set`
Derive: replace `#[clap(setting = UseValueDelimiter)]` with `#[clap(use_value_delimiter = true)]`
Builder: replace `arg.setting(UseValueDelimiter)` with `arg.use_value_delimiter(true)`
"
)
)]
UseValueDelimiter,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::next_line_help` and `Arg::is_next_line_help_set`
Derive: replace `#[clap(setting = NextLineHelp)]` with `#[clap(next_line_help = true)]`
Builder: replace `arg.setting(NextLineHelp)` with `arg.next_line_help(true)`
"
)
)]
NextLineHelp,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::require_value_delimiter` and `Arg::is_require_value_delimiter_set`
Derive: replace `#[clap(setting = RequireDelimiter)]` with `#[clap(require_value_delimiter = true)]`
Builder: replace `arg.setting(RequireDelimiter)` with `arg.require_value_delimiter(true)`
"
)
)]
RequireDelimiter,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_possible_values` and `Arg::is_hide_possible_values_set`
Derive: replace `#[clap(setting = HidePossibleValues)]` with `#[clap(hide_possible_values = true)]`
Builder: replace `arg.setting(HidePossibleValues)` with `arg.hide_possible_values(true)`
"
)
)]
HidePossibleValues,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::allow_hyphen_values` and `Arg::is_allow_hyphen_values_set`
Derive: replace `#[clap(setting = AllowHyphenValues)]` with `#[clap(allow_hyphen_values = true)]`
Builder: replace `arg.setting(AllowHyphenValues)` with `arg.allow_hyphen_values(true)`
"
)
)]
AllowHyphenValues,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.0.0",
note = "Replaced with `Arg::allow_hyphen_values` and `Arg::is_allow_hyphen_values_set`
Derive: replace `#[clap(setting = AllowLeadingHyphen)]` with `#[clap(allow_hyphen_values = true)]`
Builder: replace `arg.setting(AllowLeadingHyphen)` with `arg.allow_hyphen_values(true)`
"
)
)]
#[doc(hidden)]
AllowLeadingHyphen,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::require_equals` and `Arg::is_require_equals_set`
Derive: replace `#[clap(setting = RequireEquals)]` with `#[clap(require_equals = true)]`
Builder: replace `arg.setting(RequireEquals)` with `arg.require_equals(true)`
"
)
)]
RequireEquals,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::last` and `Arg::is_last_set`
Derive: replace `#[clap(setting = Last)]` with `#[clap(last = true)]`
Builder: replace `arg.setting(Last)` with `arg.last(true)`
"
)
)]
Last,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_default_value` and `Arg::is_hide_default_value_set`
Derive: replace `#[clap(setting = HideDefaultValue)]` with `#[clap(hide_default_value = true)]`
Builder: replace `arg.setting(HideDefaultValue)` with `arg.hide_default_value(true)`
"
)
)]
HideDefaultValue,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::ignore_case` and `Arg::is_ignore_case_set`
Derive: replace `#[clap(setting = IgnoreCase)]` with `#[clap(ignore_case = true)]`
Builder: replace `arg.setting(IgnoreCase)` with `arg.ignore_case(true)`
"
)
)]
IgnoreCase,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.0.0",
note = "Replaced with `Arg::ignore_case` and `Arg::is_ignore_case_set`
Derive: replace `#[clap(setting = CaseInsensitive)]` with `#[clap(ignore_case = true)]`
Builder: replace `arg.setting(CaseInsensitive)` with `arg.ignore_case(true)`
"
)
)]
#[doc(hidden)]
CaseInsensitive,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_env` and `Arg::is_hide_env_set`
Derive: replace `#[clap(setting = HideEnv)]` with `#[clap(hide_env = true)]`
Builder: replace `arg.setting(HideEnv)` with `arg.hide_env(true)`
"
)
)]
#[cfg(feature = "env")]
HideEnv,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_env_values` and `Arg::is_hide_env_values_set`
Derive: replace `#[clap(setting = HideEnvValues)]` with `#[clap(hide_env_values = true)]`
Builder: replace `arg.setting(HideEnvValues)` with `arg.hide_env_values(true)`
"
)
)]
#[cfg(feature = "env")]
HideEnvValues,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_short_help` and `Arg::is_hide_short_help_set`
Derive: replace `#[clap(setting = HiddenShortHelp)]` with `#[clap(hide_short_help = true)]`
Builder: replace `arg.setting(HiddenShortHelp)` with `arg.hide_short_help(true)`
"
)
)]
HiddenShortHelp,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::hide_long_help` and `Arg::is_hide_long_help_set`
Derive: replace `#[clap(setting = HiddenLongHelp)]` with `#[clap(hide_long_help = true)]`
Builder: replace `arg.setting(HiddenLongHelp)` with `arg.hide_long_help(true)`
"
)
)]
HiddenLongHelp,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `value_parser`
Derive: replace `#[clap(setting = AllowInvalidUtf8)]` with `#[clap(action)]` (which opts-in to the
new clap v4 behavior which gets the type via `value_parser!`)
Builder: replace `arg.setting(AllowInvalidUtf8)` with `arg.value_parser(value_parser!(T))` where
`T` is the type of interest, like `OsString` or `PathBuf`, and `matches.value_of_os` with
`matches.get_one::<T>` or `matches.values_of_os` with `matches.get_many::<T>`
"
)
)]
AllowInvalidUtf8,
#[cfg_attr(
feature = "deprecated",
deprecated(
since = "3.1.0",
note = "Replaced with `Arg::exclusive` and `Arg::is_exclusive_set`
Derive: replace `#[clap(setting = Exclusive)]` with `#[clap(exclusive = true)]`
Builder: replace `arg.setting(Exclusive)` with `arg.exclusive(true)`
"
)
)]
Exclusive,
}
bitflags! {
struct Flags: u32 {
const REQUIRED = 1;
const MULTIPLE_OCC = 1 << 1;
const NO_EMPTY_VALS = 1 << 2;
const GLOBAL = 1 << 3;
const HIDDEN = 1 << 4;
const TAKES_VAL = 1 << 5;
const USE_DELIM = 1 << 6;
const NEXT_LINE_HELP = 1 << 7;
const REQ_DELIM = 1 << 9;
const DELIM_NOT_SET = 1 << 10;
const HIDE_POS_VALS = 1 << 11;
const ALLOW_TAC_VALS = 1 << 12;
const REQUIRE_EQUALS = 1 << 13;
const LAST = 1 << 14;
const HIDE_DEFAULT_VAL = 1 << 15;
const CASE_INSENSITIVE = 1 << 16;
#[cfg(feature = "env")]
const HIDE_ENV_VALS = 1 << 17;
const HIDDEN_SHORT_H = 1 << 18;
const HIDDEN_LONG_H = 1 << 19;
const MULTIPLE_VALS = 1 << 20;
const MULTIPLE = Self::MULTIPLE_OCC.bits | Self::MULTIPLE_VALS.bits;
#[cfg(feature = "env")]
const HIDE_ENV = 1 << 21;
const UTF8_NONE = 1 << 22;
const EXCLUSIVE = 1 << 23;
const NO_OP = 0;
}
}
impl_settings! { ArgSettings, ArgFlags,
Required => Flags::REQUIRED,
MultipleOccurrences => Flags::MULTIPLE_OCC,
MultipleValues => Flags::MULTIPLE_VALS,
Multiple => Flags::MULTIPLE,
ForbidEmptyValues => Flags::NO_EMPTY_VALS,
Global => Flags::GLOBAL,
Hidden => Flags::HIDDEN,
TakesValue => Flags::TAKES_VAL,
UseValueDelimiter => Flags::USE_DELIM,
NextLineHelp => Flags::NEXT_LINE_HELP,
RequireDelimiter => Flags::REQ_DELIM,
HidePossibleValues => Flags::HIDE_POS_VALS,
AllowHyphenValues => Flags::ALLOW_TAC_VALS,
AllowLeadingHyphen => Flags::ALLOW_TAC_VALS,
RequireEquals => Flags::REQUIRE_EQUALS,
Last => Flags::LAST,
IgnoreCase => Flags::CASE_INSENSITIVE,
CaseInsensitive => Flags::CASE_INSENSITIVE,
#[cfg(feature = "env")]
HideEnv => Flags::HIDE_ENV,
#[cfg(feature = "env")]
HideEnvValues => Flags::HIDE_ENV_VALS,
HideDefaultValue => Flags::HIDE_DEFAULT_VAL,
HiddenShortHelp => Flags::HIDDEN_SHORT_H,
HiddenLongHelp => Flags::HIDDEN_LONG_H,
AllowInvalidUtf8 => Flags::UTF8_NONE,
Exclusive => Flags::EXCLUSIVE
}
#[cfg(feature = "yaml")]
impl FromStr for ArgSettings {
type Err = String;
fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
#[allow(deprecated)]
#[allow(unreachable_patterns)]
match &*s.to_ascii_lowercase() {
"required" => Ok(ArgSettings::Required),
"multipleoccurrences" => Ok(ArgSettings::MultipleOccurrences),
"multiplevalues" => Ok(ArgSettings::MultipleValues),
"multiple" => Ok(ArgSettings::Multiple),
"forbidemptyvalues" => Ok(ArgSettings::ForbidEmptyValues),
"global" => Ok(ArgSettings::Global),
"hidden" => Ok(ArgSettings::Hidden),
"takesvalue" => Ok(ArgSettings::TakesValue),
"usevaluedelimiter" => Ok(ArgSettings::UseValueDelimiter),
"nextlinehelp" => Ok(ArgSettings::NextLineHelp),
"requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
"hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
"allowhyphenvalues" => Ok(ArgSettings::AllowHyphenValues),
"allowleadinghypyhen" => Ok(ArgSettings::AllowLeadingHyphen),
"requireequals" => Ok(ArgSettings::RequireEquals),
"last" => Ok(ArgSettings::Last),
"ignorecase" => Ok(ArgSettings::IgnoreCase),
"caseinsensitive" => Ok(ArgSettings::CaseInsensitive),
#[cfg(feature = "env")]
"hideenv" => Ok(ArgSettings::HideEnv),
#[cfg(feature = "env")]
"hideenvvalues" => Ok(ArgSettings::HideEnvValues),
"hidedefaultvalue" => Ok(ArgSettings::HideDefaultValue),
"hiddenshorthelp" => Ok(ArgSettings::HiddenShortHelp),
"hiddenlonghelp" => Ok(ArgSettings::HiddenLongHelp),
"allowinvalidutf8" => Ok(ArgSettings::AllowInvalidUtf8),
"exclusive" => Ok(ArgSettings::Exclusive),
_ => Err(format!("unknown AppSetting: `{}`", s)),
}
}
}
#[cfg(test)]
mod test {
#[test]
#[cfg(feature = "yaml")]
fn arg_settings_fromstr() {
use super::ArgSettings;
assert_eq!(
"allowhyphenvalues".parse::<ArgSettings>().unwrap(),
ArgSettings::AllowHyphenValues
);
assert_eq!(
"forbidemptyvalues".parse::<ArgSettings>().unwrap(),
ArgSettings::ForbidEmptyValues
);
assert_eq!(
"hidepossiblevalues".parse::<ArgSettings>().unwrap(),
ArgSettings::HidePossibleValues
);
assert_eq!(
"hidden".parse::<ArgSettings>().unwrap(),
ArgSettings::Hidden
);
assert_eq!(
"nextlinehelp".parse::<ArgSettings>().unwrap(),
ArgSettings::NextLineHelp
);
assert_eq!(
"requiredelimiter".parse::<ArgSettings>().unwrap(),
ArgSettings::RequireDelimiter
);
assert_eq!(
"required".parse::<ArgSettings>().unwrap(),
ArgSettings::Required
);
assert_eq!(
"takesvalue".parse::<ArgSettings>().unwrap(),
ArgSettings::TakesValue
);
assert_eq!(
"usevaluedelimiter".parse::<ArgSettings>().unwrap(),
ArgSettings::UseValueDelimiter
);
assert_eq!(
"requireequals".parse::<ArgSettings>().unwrap(),
ArgSettings::RequireEquals
);
assert_eq!("last".parse::<ArgSettings>().unwrap(), ArgSettings::Last);
assert_eq!(
"hidedefaultvalue".parse::<ArgSettings>().unwrap(),
ArgSettings::HideDefaultValue
);
assert_eq!(
"ignorecase".parse::<ArgSettings>().unwrap(),
ArgSettings::IgnoreCase
);
#[cfg(feature = "env")]
assert_eq!(
"hideenv".parse::<ArgSettings>().unwrap(),
ArgSettings::HideEnv
);
#[cfg(feature = "env")]
assert_eq!(
"hideenvvalues".parse::<ArgSettings>().unwrap(),
ArgSettings::HideEnvValues
);
assert_eq!(
"hiddenshorthelp".parse::<ArgSettings>().unwrap(),
ArgSettings::HiddenShortHelp
);
assert_eq!(
"hiddenlonghelp".parse::<ArgSettings>().unwrap(),
ArgSettings::HiddenLongHelp
);
assert_eq!(
"allowinvalidutf8".parse::<ArgSettings>().unwrap(),
ArgSettings::AllowInvalidUtf8
);
assert_eq!(
"exclusive".parse::<ArgSettings>().unwrap(),
ArgSettings::Exclusive
);
assert!("hahahaha".parse::<ArgSettings>().is_err());
}
}