| 1 | #[ allow(unused)] | 
| 2 | use crate::Arg; | 
|---|
| 3 |  | 
|---|
| 4 | #[ derive(Default, Copy, Clone, Debug, PartialEq, Eq)] | 
|---|
| 5 | pub(crate) struct ArgFlags(u32); | 
|---|
| 6 |  | 
|---|
| 7 | impl ArgFlags { | 
|---|
| 8 | pub(crate) fn set(&mut self, setting: ArgSettings) { | 
|---|
| 9 | self.0 |= setting.bit(); | 
|---|
| 10 | } | 
|---|
| 11 |  | 
|---|
| 12 | pub(crate) fn unset(&mut self, setting: ArgSettings) { | 
|---|
| 13 | self.0 &= !setting.bit(); | 
|---|
| 14 | } | 
|---|
| 15 |  | 
|---|
| 16 | pub(crate) fn is_set(&self, setting: ArgSettings) -> bool { | 
|---|
| 17 | self.0 & setting.bit() != 0 | 
|---|
| 18 | } | 
|---|
| 19 |  | 
|---|
| 20 | pub(crate) fn insert(&mut self, other: Self) { | 
|---|
| 21 | self.0 |= other.0; | 
|---|
| 22 | } | 
|---|
| 23 | } | 
|---|
| 24 |  | 
|---|
| 25 | impl std::ops::BitOr for ArgFlags { | 
|---|
| 26 | type Output = Self; | 
|---|
| 27 |  | 
|---|
| 28 | fn bitor(mut self, rhs: Self) -> Self::Output { | 
|---|
| 29 | self.insert(rhs); | 
|---|
| 30 | self | 
|---|
| 31 | } | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | /// Various settings that apply to arguments and may be set, unset, and checked via getter/setter | 
|---|
| 35 | /// methods [`Arg::setting`], [`Arg::unset_setting`], and [`Arg::is_set`]. This is what the | 
|---|
| 36 | /// [`Arg`] methods which accept a `bool` use internally. | 
|---|
| 37 | /// | 
|---|
| 38 | /// [`Arg`]: crate::Arg | 
|---|
| 39 | /// [`Arg::setting`]: crate::Arg::setting() | 
|---|
| 40 | /// [`Arg::unset_setting`]: crate::Arg::unset_setting() | 
|---|
| 41 | /// [`Arg::is_set`]: crate::Arg::is_set() | 
|---|
| 42 | #[ derive(Debug, PartialEq, Copy, Clone)] | 
|---|
| 43 | #[ repr(u8)] | 
|---|
| 44 | pub(crate) enum ArgSettings { | 
|---|
| 45 | Required, | 
|---|
| 46 | Global, | 
|---|
| 47 | Hidden, | 
|---|
| 48 | NextLineHelp, | 
|---|
| 49 | HidePossibleValues, | 
|---|
| 50 | AllowHyphenValues, | 
|---|
| 51 | AllowNegativeNumbers, | 
|---|
| 52 | RequireEquals, | 
|---|
| 53 | Last, | 
|---|
| 54 | TrailingVarArg, | 
|---|
| 55 | HideDefaultValue, | 
|---|
| 56 | IgnoreCase, | 
|---|
| 57 | #[ cfg(feature = "env")] | 
|---|
| 58 | HideEnv, | 
|---|
| 59 | #[ cfg(feature = "env")] | 
|---|
| 60 | HideEnvValues, | 
|---|
| 61 | HiddenShortHelp, | 
|---|
| 62 | HiddenLongHelp, | 
|---|
| 63 | Exclusive, | 
|---|
| 64 | } | 
|---|
| 65 |  | 
|---|
| 66 | impl ArgSettings { | 
|---|
| 67 | fn bit(self) -> u32 { | 
|---|
| 68 | 1 << (self as u8) | 
|---|
| 69 | } | 
|---|
| 70 | } | 
|---|
| 71 |  | 
|---|
| 72 | #[ cfg(test)] | 
|---|
| 73 | mod test { | 
|---|
| 74 | use super::*; | 
|---|
| 75 | use crate::Arg; | 
|---|
| 76 |  | 
|---|
| 77 | #[ test] | 
|---|
| 78 | fn setting() { | 
|---|
| 79 | let m = Arg::new( "setting").setting(ArgSettings::Required); | 
|---|
| 80 | assert!(m.is_required_set()); | 
|---|
| 81 | } | 
|---|
| 82 |  | 
|---|
| 83 | #[ test] | 
|---|
| 84 | fn unset_setting() { | 
|---|
| 85 | let m = Arg::new( "unset_setting").setting(ArgSettings::Required); | 
|---|
| 86 | assert!(m.is_required_set()); | 
|---|
| 87 |  | 
|---|
| 88 | let m = m.unset_setting(ArgSettings::Required); | 
|---|
| 89 | assert!(!m.is_required_set(), "{m:#?}"); | 
|---|
| 90 | } | 
|---|
| 91 | } | 
|---|
| 92 |  | 
|---|