2 use std
::fmt
::{Display, Formatter, Result}
;
4 use std
::result
::Result
as StdResult
;
5 use std
::ffi
::{OsStr, OsString}
;
9 use vec_map
::{self, VecMap}
;
12 use args
::{ArgSettings, AnyArg, Base, Switched, Valued, Arg, DispOrder}
;
14 #[allow(missing_debug_implementations)]
16 #[derive(Default, Clone)]
17 pub struct OptBuilder
<'n
, 'e
>
22 pub v
: Valued
<'n
, 'e
>,
25 impl<'n
, 'e
> OptBuilder
<'n
, 'e
> {
26 pub fn new(name
: &'n
str) -> Self { OptBuilder { b: Base::new(name), ..Default::default() }
}
29 impl<'n
, 'e
, 'z
> From
<&'z Arg
<'n
, 'e
>> for OptBuilder
<'n
, 'e
> {
30 fn from(a
: &'z Arg
<'n
, 'e
>) -> Self {
39 impl<'n
, 'e
> From
<Arg
<'n
, 'e
>> for OptBuilder
<'n
, 'e
> {
40 fn from(mut a
: Arg
<'n
, 'e
>) -> Self {
43 b
: mem
::replace(&mut a
.b
, Base
::default()),
44 s
: mem
::replace(&mut a
.s
, Switched
::default()),
45 v
: mem
::replace(&mut a
.v
, Valued
::default()),
50 impl<'n
, 'e
> Display
for OptBuilder
<'n
, 'e
> {
51 fn fmt(&self, f
: &mut Formatter
) -> Result
{
52 debugln
!("OptBuilder::fmt:{}", self.b
.name
);
53 let sep
= if self.b
.is_set(ArgSettings
::RequireEquals
) {
58 // Write the name such --long or -l
59 if let Some(l
) = self.s
.long
{
60 write
!(f
, "--{}{}", l
, sep
)?
;
62 write
!(f
, "-{}{}", self.s
.short
.unwrap(), sep
)?
;
65 // Write the values such as <name1> <name2>
66 if let Some(ref vec
) = self.v
.val_names
{
67 let mut it
= vec
.iter().peekable();
68 while let Some((_
, val
)) = it
.next() {
69 write
!(f
, "<{}>", val
)?
;
70 if it
.peek().is_some() {
75 if self.is_set(ArgSettings
::Multiple
) && num
== 1 {
78 } else if let Some(num
) = self.v
.num_vals
{
79 let mut it
= (0..num
).peekable();
80 while let Some(_
) = it
.next() {
81 write
!(f
, "<{}>", self.b
.name
)?
;
82 if it
.peek().is_some() {
86 if self.is_set(ArgSettings
::Multiple
) && num
== 1 {
93 if self.is_set(ArgSettings
::Multiple
) {
104 impl<'n
, 'e
> AnyArg
<'n
, 'e
> for OptBuilder
<'n
, 'e
> {
105 fn name(&self) -> &'n
str { self.b.name }
106 fn overrides(&self) -> Option
<&[&'e
str]> { self.b.overrides.as_ref().map(|o| &o[..]) }
107 fn requires(&self) -> Option
<&[(Option
<&'e
str>, &'n
str)]> {
108 self.b
.requires
.as_ref().map(|o
| &o
[..])
110 fn blacklist(&self) -> Option
<&[&'e
str]> { self.b.blacklist.as_ref().map(|o| &o[..]) }
111 fn required_unless(&self) -> Option
<&[&'e
str]> { self.b.r_unless.as_ref().map(|o| &o[..]) }
112 fn val_names(&self) -> Option
<&VecMap
<&'e
str>> { self.v.val_names.as_ref() }
113 fn is_set(&self, s
: ArgSettings
) -> bool { self.b.settings.is_set(s) }
114 fn has_switch(&self) -> bool { true }
115 fn set(&mut self, s
: ArgSettings
) { self.b.settings.set(s) }
116 fn max_vals(&self) -> Option
<u64> { self.v.max_vals }
117 fn val_terminator(&self) -> Option
<&'e
str> { self.v.terminator }
118 fn num_vals(&self) -> Option
<u64> { self.v.num_vals }
119 fn possible_vals(&self) -> Option
<&[&'e
str]> { self.v.possible_vals.as_ref().map(|o| &o[..]) }
120 fn validator(&self) -> Option
<&Rc
<Fn(String
) -> StdResult
<(), String
>>> {
121 self.v
.validator
.as_ref()
123 fn validator_os(&self) -> Option
<&Rc
<Fn(&OsStr
) -> StdResult
<(), OsString
>>> {
124 self.v
.validator_os
.as_ref()
126 fn min_vals(&self) -> Option
<u64> { self.v.min_vals }
127 fn short(&self) -> Option
<char> { self.s.short }
128 fn long(&self) -> Option
<&'e
str> { self.s.long }
129 fn val_delim(&self) -> Option
<char> { self.v.val_delim }
130 fn takes_value(&self) -> bool { true }
131 fn help(&self) -> Option
<&'e
str> { self.b.help }
132 fn long_help(&self) -> Option
<&'e
str> { self.b.long_help }
133 fn default_val(&self) -> Option
<&'e OsStr
> { self.v.default_val }
134 fn default_vals_ifs(&self) -> Option
<vec_map
::Values
<(&'n
str, Option
<&'e OsStr
>, &'e OsStr
)>> {
135 self.v
.default_vals_ifs
.as_ref().map(|vm
| vm
.values())
137 fn longest_filter(&self) -> bool { true }
138 fn aliases(&self) -> Option
<Vec
<&'e
str>> {
139 if let Some(ref aliases
) = self.s
.aliases
{
140 let vis_aliases
: Vec
<_
> = aliases
.iter()
141 .filter_map(|&(n
, v
)| if v { Some(n) }
else { None }
)
143 if vis_aliases
.is_empty() {
154 impl<'n
, 'e
> DispOrder
for OptBuilder
<'n
, 'e
> {
155 fn disp_ord(&self) -> usize { self.s.disp_ord }
158 impl<'n
, 'e
> PartialEq
for OptBuilder
<'n
, 'e
> {
159 fn eq(&self, other
: &OptBuilder
<'n
, 'e
>) -> bool
{
166 use args
::settings
::ArgSettings
;
167 use super::OptBuilder
;
171 fn optbuilder_display1() {
172 let mut o
= OptBuilder
::new("opt");
173 o
.s
.long
= Some("option");
174 o
.b
.settings
.set(ArgSettings
::Multiple
);
176 assert_eq
!(&*format
!("{}", o
), "--option <opt>...");
180 fn optbuilder_display2() {
181 let mut v_names
= VecMap
::new();
182 v_names
.insert(0, "file");
183 v_names
.insert(1, "name");
185 let mut o2
= OptBuilder
::new("opt");
186 o2
.s
.short
= Some('o'
);
187 o2
.v
.val_names
= Some(v_names
);
189 assert_eq
!(&*format
!("{}", o2
), "-o <file> <name>");
193 fn optbuilder_display3() {
194 let mut v_names
= VecMap
::new();
195 v_names
.insert(0, "file");
196 v_names
.insert(1, "name");
198 let mut o2
= OptBuilder
::new("opt");
199 o2
.s
.short
= Some('o'
);
200 o2
.v
.val_names
= Some(v_names
);
201 o2
.b
.settings
.set(ArgSettings
::Multiple
);
203 assert_eq
!(&*format
!("{}", o2
), "-o <file> <name>");
207 fn optbuilder_display_single_alias() {
208 let mut o
= OptBuilder
::new("opt");
209 o
.s
.long
= Some("option");
210 o
.s
.aliases
= Some(vec
![("als", true)]);
212 assert_eq
!(&*format
!("{}", o
), "--option <opt>");
216 fn optbuilder_display_multiple_aliases() {
217 let mut o
= OptBuilder
::new("opt");
218 o
.s
.long
= Some("option");
220 Some(vec
![("als_not_visible", false), ("als2", true), ("als3", true), ("als4", true)]);
221 assert_eq
!(&*format
!("{}", o
), "--option <opt>");