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
|
pub struct Flags {
pub help: bool,
pub version: bool,
pub dont_persist: bool,
pub arg_count: usize
}
pub fn parse(args: &[String]) -> Option<Flags> {
let mut flags = Flags {
help: false,
version: false,
dont_persist: false,
arg_count: 0
};
for arg in args {
if !is_arg(&arg) { break; }
flags.arg_count += 1;
if arg.starts_with("--") {
let flag = &arg[2..];
if !set_flag(&flag, &mut flags) {
eprintln!("Invalid argument: {}", arg);
return None
}
} else {
let flag = &arg[1..];
for char in flag.chars() {
if !set_flag(&char.to_string(), &mut flags) {
eprintln!("Invalid argument: {}", arg);
return None
}
}
}
}
Some(flags)
}
fn is_arg(arg: &str) -> bool {
return arg.starts_with("-");
}
const HELP_FLAG: &str = "help h";
const VERSION_FLAG: &str = "version v";
const DONT_PERSIST: &str = "d";
fn set_flag(arg: &str, flags: &mut Flags) -> bool {
if has_flag_set(&arg, HELP_FLAG) {
flags.help = true;
return true
} else if has_flag_set(&arg, VERSION_FLAG) {
flags.version = true;
return true
} else if has_flag_set(&arg, DONT_PERSIST) {
flags.dont_persist = true;
return true
}
false
}
fn has_flag_set(arg: &str, check: &str) -> bool {
for check_arg in check.split(" ") {
if check_arg == arg {
return true
}
}
return false
}
|