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)?; 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}