slosh/
config.rs

1use shell::config::Config;
2use std::env;
3use std::ffi::OsString;
4
5pub const VERSION_STRING: &str = env!("VERSION_STRING");
6
7const HELP: &str = r#"slosh - Experimental Lisp REPL
8
9USAGE:
10    slosh [FLAGS] [OPTIONS] [args]
11
12FLAGS:
13    -v, --version  Print the version, platform and revision of sl-sh then exit.
14    -h, --help     Print help (this) and exit.
15
16OPTIONS:
17    -c             Command to run instead of entering the REPL.
18
19ARGS:
20    <args>...      Script to run with arguments."#;
21
22fn help(_name: &str) {
23    println!("{}", HELP);
24}
25
26fn version() {
27    println!("{}", VERSION_STRING);
28}
29
30fn get_arg(exe_name: &str, args: &mut Vec<OsString>) -> Option<String> {
31    if let Some(argument) = args.pop() {
32        if let Ok(arg) = argument.into_string() {
33            return Some(arg);
34        }
35    }
36    help(exe_name);
37    None
38}
39
40pub fn get_config() -> Option<Config> {
41    let mut command: Option<String> = None;
42    let mut script: Option<String> = None;
43    let mut command_args: Vec<String> = Vec::new();
44
45    let mut args: Vec<OsString> = env::args_os().collect();
46
47    args.reverse();
48    let exe_name = get_arg("unknown", &mut args)?; // Pop off the executable name.
49
50    while !args.is_empty() {
51        if let Some(argument) = args.pop() {
52            if let Ok(arg) = argument.into_string() {
53                match &arg[..] {
54                    "-c" => {
55                        if command.is_some() {
56                            help(&exe_name);
57                            return None;
58                        }
59                        command = Some(get_arg(&exe_name, &mut args)?);
60                    }
61                    "-v" | "--version" => {
62                        version();
63                        return None;
64                    }
65                    "-h" | "--help" => {
66                        help(&exe_name);
67                        return None;
68                    }
69                    _ => {
70                        if command.is_none() && script.is_none() {
71                            script = Some(arg);
72                        } else {
73                            command_args.push(arg);
74                        }
75                    }
76                }
77            } else {
78                help(&exe_name);
79                return None;
80            }
81        }
82    }
83    Some(Config {
84        command,
85        script,
86        args: command_args,
87    })
88}