Add parsing of command-line arguments
Currently only supports `--help` argument and settings input file implicitly from the positional arguments.
This commit is contained in:
parent
37f58e24ac
commit
4841f7b657
67
src/main.rs
67
src/main.rs
|
@ -1,3 +1,68 @@
|
||||||
|
// Try to keep this string updated with the argument parsing, otherwise it will
|
||||||
|
// get confusing for users.
|
||||||
|
static USAGE: &'static str = "usage: pine [options] input
|
||||||
|
|
||||||
|
options:
|
||||||
|
--help print all options";
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
// Throw away the first argument, which usually is the executable name.
|
||||||
|
let args = std::env::args().skip(1).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
// If there is no arguments, we short circuit to avoid having to perform the
|
||||||
|
// expensive command-line argument generation and parsing step. We can allow
|
||||||
|
// ourselves to do this since, unlike i.e. rustc, we don't print full usage
|
||||||
|
// information on invocation of only the binary, but instead we behave more
|
||||||
|
// like clang or go.
|
||||||
|
if args.len() == 0 {
|
||||||
|
eprintln!("pine: \x1b[1;31merror\x1b[0m: no input files");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut path: Option<&str> = None;
|
||||||
|
// Handle command-line arguments.
|
||||||
|
let mut i = 0;
|
||||||
|
loop {
|
||||||
|
if i == args.len() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let arg = args[i].as_str();
|
||||||
|
|
||||||
|
if arg.starts_with("--") {
|
||||||
|
match &arg[2..] {
|
||||||
|
"help" => {
|
||||||
|
println!("{}\n", USAGE);
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
eprintln!("pine: \x1b[1;31merror\x1b[0m: unknown argument '{}'", arg);
|
||||||
|
std::process::exit(1);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} else if arg.starts_with("-") {
|
||||||
|
// We don't handle arguments that start with a single dash, this might be
|
||||||
|
// added later. For now we just exit with an error.
|
||||||
|
eprintln!("pine: \x1b[1;31merror\x1b[0m: unknown argument '{}'", arg);
|
||||||
|
std::process::exit(1);
|
||||||
|
} else {
|
||||||
|
if path.is_some() {
|
||||||
|
eprintln!("pine: \x1b[1;31merror\x1b[0m: multiple file names provided (first two are `{}` and `{}`)", path.unwrap(), arg);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use this argument as an input file.
|
||||||
|
path = Some(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if path.is_none() {
|
||||||
|
eprintln!("pine: \x1b[1;31merror\x1b[0m: no input files");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = path.unwrap();
|
||||||
|
eprintln!("compiling `{}`", path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue