#[allow(unused)] use crate::Arg; #[derive(Default, Copy, Clone, Debug, PartialEq, Eq)] pub(crate) struct ArgFlags(u32); impl ArgFlags { pub(crate) fn set(&mut self, setting: ArgSettings) { self.0 |= setting.bit(); } pub(crate) fn unset(&mut self, setting: ArgSettings) { self.0 &= !setting.bit(); } pub(crate) fn is_set(&self, setting: ArgSettings) -> bool { self.0 & setting.bit() != 0 } pub(crate) fn insert(&mut self, other: Self) { self.0 |= other.0; } } impl std::ops::BitOr for ArgFlags { type Output = Self; fn bitor(mut self, rhs: Self) -> Self::Output { self.insert(rhs); self } } /// 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)] #[repr(u8)] 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, } impl ArgSettings { fn bit(self) -> u32 { 1 << (self as u8) } } #[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:#?}"); } }