2 use std
::fmt
::{Display, Formatter, Result}
;
4 use std
::result
::Result
as StdResult
;
5 use std
::ffi
::{OsStr, OsString}
;
9 use args
::{AnyArg, Arg, ArgSettings, Base, DispOrder, Switched, Valued}
;
10 use map
::{self, VecMap}
;
11 use INTERNAL_ERROR_MSG
;
13 #[allow(missing_debug_implementations)]
15 #[derive(Default, Clone)]
16 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 {
34 impl<'n
, 'e
, 'z
> From
<&'z Arg
<'n
, 'e
>> for OptBuilder
<'n
, 'e
> {
35 fn from(a
: &'z Arg
<'n
, 'e
>) -> Self {
44 impl<'n
, 'e
> From
<Arg
<'n
, 'e
>> for OptBuilder
<'n
, 'e
> {
45 fn from(mut a
: Arg
<'n
, 'e
>) -> Self {
48 b
: mem
::replace(&mut a
.b
, Base
::default()),
49 s
: mem
::replace(&mut a
.s
, Switched
::default()),
50 v
: mem
::replace(&mut a
.v
, Valued
::default()),
55 impl<'n
, 'e
> Display
for OptBuilder
<'n
, 'e
> {
56 fn fmt(&self, f
: &mut Formatter
) -> Result
{
57 debugln
!("OptBuilder::fmt:{}", self.b
.name
);
58 let sep
= if self.b
.is_set(ArgSettings
::RequireEquals
) {
63 // Write the name such --long or -l
64 if let Some(l
) = self.s
.long
{
65 write
!(f
, "--{}{}", l
, sep
)?
;
67 write
!(f
, "-{}{}", self.s
.short
.unwrap(), sep
)?
;
69 let delim
= if self.is_set(ArgSettings
::RequireDelimiter
) {
70 self.v
.val_delim
.expect(INTERNAL_ERROR_MSG
)
75 // Write the values such as <name1> <name2>
76 if let Some(ref vec
) = self.v
.val_names
{
77 let mut it
= vec
.iter().peekable();
78 while let Some((_
, val
)) = it
.next() {
79 write
!(f
, "<{}>", val
)?
;
80 if it
.peek().is_some() {
81 write
!(f
, "{}", delim
)?
;
85 if self.is_set(ArgSettings
::Multiple
) && num
== 1 {
88 } else if let Some(num
) = self.v
.num_vals
{
89 let mut it
= (0..num
).peekable();
90 while let Some(_
) = it
.next() {
91 write
!(f
, "<{}>", self.b
.name
)?
;
92 if it
.peek().is_some() {
93 write
!(f
, "{}", delim
)?
;
96 if self.is_set(ArgSettings
::Multiple
) && num
== 1 {
104 if self.is_set(ArgSettings
::Multiple
) {
116 impl<'n
, 'e
> AnyArg
<'n
, 'e
> for OptBuilder
<'n
, 'e
> {
117 fn name(&self) -> &'n
str { self.b.name }
118 fn overrides(&self) -> Option
<&[&'e
str]> { self.b.overrides.as_ref().map(|o| &o[..]) }
119 fn requires(&self) -> Option
<&[(Option
<&'e
str>, &'n
str)]> {
120 self.b
.requires
.as_ref().map(|o
| &o
[..])
122 fn blacklist(&self) -> Option
<&[&'e
str]> { self.b.blacklist.as_ref().map(|o| &o[..]) }
123 fn required_unless(&self) -> Option
<&[&'e
str]> { self.b.r_unless.as_ref().map(|o| &o[..]) }
124 fn val_names(&self) -> Option
<&VecMap
<&'e
str>> { self.v.val_names.as_ref() }
125 fn is_set(&self, s
: ArgSettings
) -> bool { self.b.settings.is_set(s) }
126 fn has_switch(&self) -> bool { true }
127 fn set(&mut self, s
: ArgSettings
) { self.b.settings.set(s) }
128 fn max_vals(&self) -> Option
<u64> { self.v.max_vals }
129 fn val_terminator(&self) -> Option
<&'e
str> { self.v.terminator }
130 fn num_vals(&self) -> Option
<u64> { self.v.num_vals }
131 fn possible_vals(&self) -> Option
<&[&'e
str]> { self.v.possible_vals.as_ref().map(|o| &o[..]) }
132 fn validator(&self) -> Option
<&Rc
<Fn(String
) -> StdResult
<(), String
>>> {
133 self.v
.validator
.as_ref()
135 fn validator_os(&self) -> Option
<&Rc
<Fn(&OsStr
) -> StdResult
<(), OsString
>>> {
136 self.v
.validator_os
.as_ref()
138 fn min_vals(&self) -> Option
<u64> { self.v.min_vals }
139 fn short(&self) -> Option
<char> { self.s.short }
140 fn long(&self) -> Option
<&'e
str> { self.s.long }
141 fn val_delim(&self) -> Option
<char> { self.v.val_delim }
142 fn takes_value(&self) -> bool { true }
143 fn help(&self) -> Option
<&'e
str> { self.b.help }
144 fn long_help(&self) -> Option
<&'e
str> { self.b.long_help }
145 fn default_val(&self) -> Option
<&'e OsStr
> { self.v.default_val }
146 fn default_vals_ifs(&self) -> Option
<map
::Values
<(&'n
str, Option
<&'e OsStr
>, &'e OsStr
)>> {
147 self.v
.default_vals_ifs
.as_ref().map(|vm
| vm
.values())
149 fn env
<'s
>(&'s
self) -> Option
<(&'n OsStr
, Option
<&'s OsString
>)> {
153 .map(|&(key
, ref value
)| (key
, value
.as_ref()))
155 fn longest_filter(&self) -> bool { true }
156 fn aliases(&self) -> Option
<Vec
<&'e
str>> {
157 if let Some(ref aliases
) = self.s
.aliases
{
158 let vis_aliases
: Vec
<_
> = aliases
160 .filter_map(|&(n
, v
)| if v { Some(n) }
else { None }
)
162 if vis_aliases
.is_empty() {
173 impl<'n
, 'e
> DispOrder
for OptBuilder
<'n
, 'e
> {
174 fn disp_ord(&self) -> usize { self.s.disp_ord }
177 impl<'n
, 'e
> PartialEq
for OptBuilder
<'n
, 'e
> {
178 fn eq(&self, other
: &OptBuilder
<'n
, 'e
>) -> bool { self.b == other.b }
183 use args
::settings
::ArgSettings
;
184 use super::OptBuilder
;
188 fn optbuilder_display1() {
189 let mut o
= OptBuilder
::new("opt");
190 o
.s
.long
= Some("option");
191 o
.b
.settings
.set(ArgSettings
::Multiple
);
193 assert_eq
!(&*format
!("{}", o
), "--option <opt>...");
197 fn optbuilder_display2() {
198 let mut v_names
= VecMap
::new();
199 v_names
.insert(0, "file");
200 v_names
.insert(1, "name");
202 let mut o2
= OptBuilder
::new("opt");
203 o2
.s
.short
= Some('o'
);
204 o2
.v
.val_names
= Some(v_names
);
206 assert_eq
!(&*format
!("{}", o2
), "-o <file> <name>");
210 fn optbuilder_display3() {
211 let mut v_names
= VecMap
::new();
212 v_names
.insert(0, "file");
213 v_names
.insert(1, "name");
215 let mut o2
= OptBuilder
::new("opt");
216 o2
.s
.short
= Some('o'
);
217 o2
.v
.val_names
= Some(v_names
);
218 o2
.b
.settings
.set(ArgSettings
::Multiple
);
220 assert_eq
!(&*format
!("{}", o2
), "-o <file> <name>");
224 fn optbuilder_display_single_alias() {
225 let mut o
= OptBuilder
::new("opt");
226 o
.s
.long
= Some("option");
227 o
.s
.aliases
= Some(vec
![("als", true)]);
229 assert_eq
!(&*format
!("{}", o
), "--option <opt>");
233 fn optbuilder_display_multiple_aliases() {
234 let mut o
= OptBuilder
::new("opt");
235 o
.s
.long
= Some("option");
236 o
.s
.aliases
= Some(vec
![
237 ("als_not_visible", false),
242 assert_eq
!(&*format
!("{}", o
), "--option <opt>");