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
use std::env;
use std::process;

use crate::config::Config;

use getopts::Options;

pub fn parse_args(name: &str) -> Option<Config> {
    let args: Vec<String> = env::args().collect();

    let mut opts = Options::new();
    opts.optopt("c", "", "configuration path", "config");
    opts.optflag("h", "help", "print this help");

    let matches = match opts.parse(&args[1..]) {
        Ok(m) => m,
        Err(_) => {
            print!("{}", opts.usage(&format!("Usage: {} -c PATH", name)));
            return None;
        }
    };

    if matches.opt_present("h") {
        print!("{}", opts.usage(&format!("Usage: {} -c PATH", name)));
        process::exit(0);
    }

    let path = matches.opt_str("c").unwrap_or_default();
    match Config::new(path) {
        Ok(c) => Some(c),
        Err(e) => {
            log::error!("{}", e);
            None
        }
    }
}