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 { set(&mut self, setting: ArgSettings)8 pub(crate) fn set(&mut self, setting: ArgSettings) { 9 self.0 |= setting.bit(); 10 } 11 unset(&mut self, setting: ArgSettings)12 pub(crate) fn unset(&mut self, setting: ArgSettings) { 13 self.0 &= !setting.bit(); 14 } 15 is_set(&self, setting: ArgSettings) -> bool16 pub(crate) fn is_set(&self, setting: ArgSettings) -> bool { 17 self.0 & setting.bit() != 0 18 } 19 insert(&mut self, other: Self)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 bitor(mut self, rhs: Self) -> Self::Output28 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 { bit(self) -> u3267 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] setting()78 fn setting() { 79 let m = Arg::new("setting").setting(ArgSettings::Required); 80 assert!(m.is_required_set()); 81 } 82 83 #[test] unset_setting()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