4 ffi
::{OsStr, OsString}
,
5 fmt
::{Display, Formatter, Result}
,
8 result
::Result
as StdResult
,
13 args
::{AnyArg, Arg, ArgSettings, Base, DispOrder, Valued}
,
18 #[allow(missing_debug_implementations)]
20 #[derive(Clone, Default)]
21 pub struct PosBuilder
<'n
, 'e
>
26 pub v
: Valued
<'n
, 'e
>,
30 impl<'n
, 'e
> PosBuilder
<'n
, 'e
> {
31 pub fn new(name
: &'n
str, idx
: u64) -> Self {
39 pub fn from_arg_ref(a
: &Arg
<'n
, 'e
>, idx
: u64) -> Self {
40 let mut pb
= PosBuilder
{
45 if a
.v
.max_vals
.is_some()
46 || a
.v
.min_vals
.is_some()
47 || (a
.v
.num_vals
.is_some() && a
.v
.num_vals
.unwrap() > 1)
49 pb
.b
.settings
.set(ArgSettings
::Multiple
);
54 pub fn from_arg(mut a
: Arg
<'n
, 'e
>, idx
: u64) -> Self {
55 if a
.v
.max_vals
.is_some()
56 || a
.v
.min_vals
.is_some()
57 || (a
.v
.num_vals
.is_some() && a
.v
.num_vals
.unwrap() > 1)
59 a
.b
.settings
.set(ArgSettings
::Multiple
);
62 b
: mem
::take(&mut a
.b
),
63 v
: mem
::take(&mut a
.v
),
68 pub fn multiple_str(&self) -> &str {
73 .map_or(true, |names
| names
.len() < 2);
74 if self.is_set(ArgSettings
::Multiple
) && mult_vals
{
81 pub fn name_no_brackets(&self) -> Cow
<str> {
82 debugln
!("PosBuilder::name_no_brackets;");
83 let mut delim
= String
::new();
84 delim
.push(if self.is_set(ArgSettings
::RequireDelimiter
) {
85 self.v
.val_delim
.expect(INTERNAL_ERROR_MSG
)
89 if let Some(ref names
) = self.v
.val_names
{
90 debugln
!("PosBuilder:name_no_brackets: val_names={:#?}", names
);
95 .map(|n
| format
!("<{}>", n
))
100 Cow
::Borrowed(names
.values().next().expect(INTERNAL_ERROR_MSG
))
103 debugln
!("PosBuilder:name_no_brackets: just name");
104 Cow
::Borrowed(self.b
.name
)
109 impl<'n
, 'e
> Display
for PosBuilder
<'n
, 'e
> {
110 fn fmt(&self, f
: &mut Formatter
) -> Result
{
111 let mut delim
= String
::new();
112 delim
.push(if self.is_set(ArgSettings
::RequireDelimiter
) {
113 self.v
.val_delim
.expect(INTERNAL_ERROR_MSG
)
117 if let Some(ref names
) = self.v
.val_names
{
123 .map(|n
| format
!("<{}>", n
))
128 write
!(f
, "<{}>", self.b
.name
)?
;
130 if self.b
.settings
.is_set(ArgSettings
::Multiple
)
131 && (self.v
.val_names
.is_none() || self.v
.val_names
.as_ref().unwrap().len() == 1)
140 impl<'n
, 'e
> AnyArg
<'n
, 'e
> for PosBuilder
<'n
, 'e
> {
141 fn name(&self) -> &'n
str {
144 fn overrides(&self) -> Option
<&[&'e
str]> {
145 self.b
.overrides
.as_ref().map(|o
| &o
[..])
147 fn requires(&self) -> Option
<&[(Option
<&'e
str>, &'n
str)]> {
148 self.b
.requires
.as_ref().map(|o
| &o
[..])
150 fn blacklist(&self) -> Option
<&[&'e
str]> {
151 self.b
.blacklist
.as_ref().map(|o
| &o
[..])
153 fn required_unless(&self) -> Option
<&[&'e
str]> {
154 self.b
.r_unless
.as_ref().map(|o
| &o
[..])
156 fn val_names(&self) -> Option
<&VecMap
<&'e
str>> {
157 self.v
.val_names
.as_ref()
159 fn is_set(&self, s
: ArgSettings
) -> bool
{
160 self.b
.settings
.is_set(s
)
162 fn set(&mut self, s
: ArgSettings
) {
163 self.b
.settings
.set(s
)
165 fn has_switch(&self) -> bool
{
168 fn max_vals(&self) -> Option
<u64> {
171 fn val_terminator(&self) -> Option
<&'e
str> {
174 fn num_vals(&self) -> Option
<u64> {
177 fn possible_vals(&self) -> Option
<&[&'e
str]> {
178 self.v
.possible_vals
.as_ref().map(|o
| &o
[..])
180 #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
181 fn validator(&self) -> Option
<&Rc
<Fn(String
) -> StdResult
<(), String
>>> {
182 self.v
.validator
.as_ref()
184 #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
185 fn validator_os(&self) -> Option
<&Rc
<Fn(&OsStr
) -> StdResult
<(), OsString
>>> {
186 self.v
.validator_os
.as_ref()
188 fn min_vals(&self) -> Option
<u64> {
191 fn short(&self) -> Option
<char> {
194 fn long(&self) -> Option
<&'e
str> {
197 fn val_delim(&self) -> Option
<char> {
200 fn takes_value(&self) -> bool
{
203 fn help(&self) -> Option
<&'e
str> {
206 fn long_help(&self) -> Option
<&'e
str> {
209 fn default_vals_ifs(&self) -> Option
<map
::Values
<(&'n
str, Option
<&'e OsStr
>, &'e OsStr
)>> {
210 self.v
.default_vals_ifs
.as_ref().map(|vm
| vm
.values())
212 fn default_val(&self) -> Option
<&'e OsStr
> {
215 fn env
<'s
>(&'s
self) -> Option
<(&'n OsStr
, Option
<&'s OsString
>)> {
219 .map(|&(key
, ref value
)| (key
, value
.as_ref()))
221 fn longest_filter(&self) -> bool
{
224 fn aliases(&self) -> Option
<Vec
<&'e
str>> {
229 impl<'n
, 'e
> DispOrder
for PosBuilder
<'n
, 'e
> {
230 fn disp_ord(&self) -> usize {
235 impl<'n
, 'e
> PartialEq
for PosBuilder
<'n
, 'e
> {
236 fn eq(&self, other
: &PosBuilder
<'n
, 'e
>) -> bool
{
243 use super::PosBuilder
;
244 use crate::{args::settings::ArgSettings, map::VecMap}
;
248 let mut p
= PosBuilder
::new("pos", 1);
249 p
.b
.settings
.set(ArgSettings
::Multiple
);
251 assert_eq
!(&*format
!("{}", p
), "<pos>...");
255 fn display_required() {
256 let mut p2
= PosBuilder
::new("pos", 1);
257 p2
.b
.settings
.set(ArgSettings
::Required
);
259 assert_eq
!(&*format
!("{}", p2
), "<pos>");
263 fn display_val_names() {
264 let mut p2
= PosBuilder
::new("pos", 1);
265 let mut vm
= VecMap
::new();
266 vm
.insert(0, "file1");
267 vm
.insert(1, "file2");
268 p2
.v
.val_names
= Some(vm
);
270 assert_eq
!(&*format
!("{}", p2
), "<file1> <file2>");
274 fn display_val_names_req() {
275 let mut p2
= PosBuilder
::new("pos", 1);
276 p2
.b
.settings
.set(ArgSettings
::Required
);
277 let mut vm
= VecMap
::new();
278 vm
.insert(0, "file1");
279 vm
.insert(1, "file2");
280 p2
.v
.val_names
= Some(vm
);
282 assert_eq
!(&*format
!("{}", p2
), "<file1> <file2>");