clap/args/arg_builder/
valued.rs

1use std::rc::Rc;
2use std::ffi::{OsStr, OsString};
3
4use map::VecMap;
5
6use Arg;
7
8#[allow(missing_debug_implementations)]
9#[derive(Clone)]
10pub struct Valued<'a, 'b>
11where
12    'a: 'b,
13{
14    pub possible_vals: Option<Vec<&'b str>>,
15    pub val_names: Option<VecMap<&'b str>>,
16    pub num_vals: Option<u64>,
17    pub max_vals: Option<u64>,
18    pub min_vals: Option<u64>,
19    pub validator: Option<Rc<Fn(String) -> Result<(), String>>>,
20    pub validator_os: Option<Rc<Fn(&OsStr) -> Result<(), OsString>>>,
21    pub val_delim: Option<char>,
22    pub default_val: Option<&'b OsStr>,
23    pub default_vals_ifs: Option<VecMap<(&'a str, Option<&'b OsStr>, &'b OsStr)>>,
24    pub env: Option<(&'a OsStr, Option<OsString>)>,
25    pub terminator: Option<&'b str>,
26}
27
28impl<'n, 'e> Default for Valued<'n, 'e> {
29    fn default() -> Self {
30        Valued {
31            possible_vals: None,
32            num_vals: None,
33            min_vals: None,
34            max_vals: None,
35            val_names: None,
36            validator: None,
37            validator_os: None,
38            val_delim: None,
39            default_val: None,
40            default_vals_ifs: None,
41            env: None,
42            terminator: None,
43        }
44    }
45}
46
47impl<'n, 'e> Valued<'n, 'e> {
48    pub fn fill_in(&mut self) {
49        if let Some(ref vec) = self.val_names {
50            if vec.len() > 1 {
51                self.num_vals = Some(vec.len() as u64);
52            }
53        }
54    }
55}
56
57impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Valued<'n, 'e> {
58    fn from(a: &'z Arg<'n, 'e>) -> Self {
59        let mut v = a.v.clone();
60        if let Some(ref vec) = a.v.val_names {
61            if vec.len() > 1 {
62                v.num_vals = Some(vec.len() as u64);
63            }
64        }
65        v
66    }
67}