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
use std::str::FromStr;
use std::ascii::AsciiExt;

bitflags! {
    flags Flags: u8 {
        const REQUIRED   = 0b00001,
        const MULTIPLE   = 0b00010,
        const EMPTY_VALS = 0b00100,
        const GLOBAL     = 0b01000,
        const HIDDEN     = 0b10000,
    }
}

#[derive(Debug)]
pub struct ArgFlags(Flags);

impl ArgFlags {
    pub fn new() -> Self {
        ArgFlags(EMPTY_VALS)
    }

    pub fn set(&mut self, s: &ArgSettings) {
        match *s {
            ArgSettings::Required => self.0.insert(REQUIRED),
            ArgSettings::Multiple => self.0.insert(MULTIPLE),
            ArgSettings::EmptyValues => self.0.insert(EMPTY_VALS),
            ArgSettings::Global => self.0.insert(GLOBAL),
            ArgSettings::Hidden => self.0.insert(HIDDEN),
        }
    }

    pub fn unset(&mut self, s: &ArgSettings) {
        match *s {
            ArgSettings::Required => self.0.remove(REQUIRED),
            ArgSettings::Multiple => self.0.remove(MULTIPLE),
            ArgSettings::EmptyValues => self.0.remove(EMPTY_VALS),
            ArgSettings::Global => self.0.remove(GLOBAL),
            ArgSettings::Hidden => self.0.remove(HIDDEN),
        }
    }

    pub fn is_set(&self, s: &ArgSettings) -> bool {
        match *s {
            ArgSettings::Required => self.0.contains(REQUIRED),
            ArgSettings::Multiple => self.0.contains(MULTIPLE),
            ArgSettings::EmptyValues => self.0.contains(EMPTY_VALS),
            ArgSettings::Global => self.0.contains(GLOBAL),
            ArgSettings::Hidden => self.0.contains(HIDDEN),
        }
    }
}

impl Default for ArgFlags {
    fn default() -> Self {
        ArgFlags::new()
    }
}

#[doc(hidden)]
#[derive(Debug, PartialEq)]
pub enum ArgSettings {
    Required,
    Multiple,
    EmptyValues,
    Global,
    Hidden,
}

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),
            _ => Err("unknown ArgSetting, cannot convert from str".to_owned()),
        }
    }
}