summaryrefslogtreecommitdiff
path: root/src/flags.rs
blob: 9432b8f68a6f48afb2fa34e0ffc52f3cda6d0fe9 (plain)
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
}