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
/// Check if argv has a specific flag
/// Correctly stops looking after an -- argument terminator.
/// ## Usage
/// command input
/// ```bash
/// ls -f --unicorn --foo=bar -- --rainbow
/// ```
///
/// ```edition2018
/// use has_flag::has_flag;
/// use env::args;
/// 
/// has_flag("unicorn", args().collect());
/// //=> true
/// 
/// has_flag ("--unicorn", args().collect());
/// //=> true
/// 
/// has_flag("f", args().collect());
/// //=> true
/// 
/// has_flag("-f", args().collect());
/// //=> true
/// 
/// has_flag("foo=bar", env::args().collect());
/// //=> true
/// 
/// has_flag("foo", env::args().collect());
/// //=> false
/// 
/// has_flag("rainbow", env::args().collect());
/// //=> false
/// ```
pub fn has_flag(flag: &str, args: Vec<String>) -> bool {
    let prefix = if flag.starts_with("-") {
        ""
    } else {
        if flag.len() == 1 {
            "-"
        } else {
            "--"
        }
    };
    let args = &args;
    let position = args
        .into_iter()
        .position(|x| x == &format!("{}{}", prefix, flag));
    let terminator_position = args.into_iter().position(|x| "--" == x);
    match position {
        Some(p) => match terminator_position {
            Some(tp) => p < tp,
            None => true,
        },
        _ => false,
    }
}