1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use std::ascii::AsciiExt;
use std::str::FromStr;
bitflags! {
flags Flags: u16 {
const REQUIRED = 0b000000000001,
const MULTIPLE = 0b000000000010,
const EMPTY_VALS = 0b000000000100,
const GLOBAL = 0b000000001000,
const HIDDEN = 0b000000010000,
const TAKES_VAL = 0b000000100000,
const USE_DELIM = 0b000001000000,
const NEXT_LINE_HELP = 0b000010000000,
const R_UNLESS_ALL = 0b000100000000,
const REQ_DELIM = 0b001000000000,
const DELIM_NOT_SET = 0b010000000000,
const HIDE_POS_VALS = 0b100000000000,
}
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy)]
pub struct ArgFlags(Flags);
impl ArgFlags {
pub fn new() -> Self {
ArgFlags::default()
}
impl_settings!{ArgSettings,
Required => REQUIRED,
Multiple => MULTIPLE,
EmptyValues => EMPTY_VALS,
Global => GLOBAL,
Hidden => HIDDEN,
TakesValue => TAKES_VAL,
UseValueDelimiter => USE_DELIM,
NextLineHelp => NEXT_LINE_HELP,
RequiredUnlessAll => R_UNLESS_ALL,
RequireDelimiter => REQ_DELIM,
ValueDelimiterNotSet => DELIM_NOT_SET,
HidePossibleValues => HIDE_POS_VALS
}
}
impl Default for ArgFlags {
fn default() -> Self {
ArgFlags(EMPTY_VALS | DELIM_NOT_SET)
}
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum ArgSettings {
Required,
Multiple,
EmptyValues,
Global,
Hidden,
TakesValue,
UseValueDelimiter,
NextLineHelp,
RequireDelimiter,
HidePossibleValues,
#[doc(hidden)]
RequiredUnlessAll,
#[doc(hidden)]
ValueDelimiterNotSet,
}
impl FromStr for ArgSettings {
type Err = String;
fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
match &*s.to_ascii_lowercase() {
"required" => Ok(ArgSettings::Required),
"multiple" => Ok(ArgSettings::Multiple),
"global" => Ok(ArgSettings::Global),
"emptyvalues" => Ok(ArgSettings::EmptyValues),
"hidden" => Ok(ArgSettings::Hidden),
"takesvalue" => Ok(ArgSettings::TakesValue),
"usevaluedelimiter" => Ok(ArgSettings::UseValueDelimiter),
"nextlinehelp" => Ok(ArgSettings::NextLineHelp),
"requiredunlessall" => Ok(ArgSettings::RequiredUnlessAll),
"requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
"valuedelimiternotset" => Ok(ArgSettings::ValueDelimiterNotSet),
"hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
_ => Err("unknown ArgSetting, cannot convert from str".to_owned()),
}
}
}