// Std use std::ops::BitOr; // Third party use bitflags::bitflags; #[allow(unused)] use crate::Arg; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) struct ArgFlags(Flags); impl Default for ArgFlags { fn default() -> Self { Self::empty() } } /// Various settings that apply to arguments and may be set, unset, and checked via getter/setter /// methods [`Arg::setting`], [`Arg::unset_setting`], and [`Arg::is_set`]. This is what the /// [`Arg`] methods which accept a `bool` use internally. /// /// [`Arg`]: crate::Arg /// [`Arg::setting`]: crate::Arg::setting() /// [`Arg::unset_setting`]: crate::Arg::unset_setting() /// [`Arg::is_set`]: crate::Arg::is_set() #[derive(Debug, PartialEq, Copy, Clone)] #[non_exhaustive] pub(crate) enum ArgSettings { Required, Global, Hidden, NextLineHelp, HidePossibleValues, AllowHyphenValues, AllowNegativeNumbers, RequireEquals, Last, TrailingVarArg, HideDefaultValue, IgnoreCase, #[cfg(feature = "env")] HideEnv, #[cfg(feature = "env")] HideEnvValues, HiddenShortHelp, HiddenLongHelp, Exclusive, } bitflags! { struct Flags: u32 { const REQUIRED = 1; const GLOBAL = 1 << 3; const HIDDEN = 1 << 4; const TRAILING_VARARG = 1 << 5; const ALLOW_NEG_NUMS = 1 << 6; const NEXT_LINE_HELP = 1 << 7; 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; #[cfg(feature = "env")] const HIDE_ENV = 1 << 21; const EXCLUSIVE = 1 << 23; const NO_OP = 0; } } impl_settings! { ArgSettings, ArgFlags, Required => Flags::REQUIRED, Global => Flags::GLOBAL, Hidden => Flags::HIDDEN, NextLineHelp => Flags::NEXT_LINE_HELP, HidePossibleValues => Flags::HIDE_POS_VALS, AllowHyphenValues => Flags::ALLOW_TAC_VALS, AllowNegativeNumbers => Flags::ALLOW_NEG_NUMS, RequireEquals => Flags::REQUIRE_EQUALS, Last => Flags::LAST, TrailingVarArg => Flags::TRAILING_VARARG, IgnoreCase => 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, Exclusive => Flags::EXCLUSIVE } #[cfg(test)] mod test { use super::*; use crate::Arg; #[test] fn setting() { let m = Arg::new("setting").setting(ArgSettings::Required); assert!(m.is_required_set()); } #[test] fn unset_setting() { let m = Arg::new("unset_setting").setting(ArgSettings::Required); assert!(m.is_required_set()); let m = m.unset_setting(ArgSettings::Required); assert!(!m.is_required_set(), "{:#?}", m); } #[test] fn setting_bitor() { let m = Arg::new("setting_bitor") .setting(ArgSettings::Required | ArgSettings::Hidden | ArgSettings::Last); assert!(m.is_required_set()); assert!(m.is_hide_set()); assert!(m.is_last_set()); } #[test] fn unset_setting_bitor() { let m = Arg::new("unset_setting_bitor") .setting(ArgSettings::Required) .setting(ArgSettings::Hidden) .setting(ArgSettings::Last); assert!(m.is_required_set()); assert!(m.is_hide_set()); assert!(m.is_last_set()); let m = m.unset_setting(ArgSettings::Required | ArgSettings::Hidden | ArgSettings::Last); assert!(!m.is_required_set(), "{:#?}", m); assert!(!m.is_hide_set(), "{:#?}", m); assert!(!m.is_last_set(), "{:#?}", m); } }