| 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 | |