1#[allow(unused)]
2use crate::Arg;
3
4#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]
5pub(crate) struct ArgFlags(u32);
6
7impl 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
25impl 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)]
44pub(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
66impl ArgSettings {
67 fn bit(self) -> u32 {
68 1 << (self as u8)
69 }
70}
71
72#[cfg(test)]
73mod 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