Skip to content

Commit c800afc

Browse files
committed
Ensure we don't pass too many status flags
1 parent 0b180e9 commit c800afc

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

rust_src/driver.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,18 @@ pub struct Cli {
3737
}
3838

3939
type ArgVec = Vec<String>;
40-
fn parse_arguments(args: ArgVec) -> Cli {
41-
Cli::parse_from(args)
42-
// TODO exclusivity checking for --lex, --codegen, etc.
40+
fn parse_arguments(args: ArgVec) -> Result<Cli, Error> {
41+
let cli = Cli::parse_from(args);
42+
if cli.lex as i32 + cli.codegen as i32 + cli.tacky as i32 + cli.asm_only as i32 > 1 {
43+
return Err("At most 1 of --lex, --codegen, --tacky, --asm-only may be passed".to_string());
44+
} else {
45+
return Ok(cli);
46+
}
4347
}
4448

4549
pub fn driver_main(args: &mut env::Args) -> Result<(), Error> {
4650
let args: ArgVec = args.collect();
47-
let cli = parse_arguments(args);
51+
let cli = parse_arguments(args)?;
4852
dbg!(cli);
4953
Ok(())
5054
}
@@ -55,8 +59,20 @@ mod tests {
5559

5660
#[test]
5761
fn arg_parser() {
58-
// TODO test extra arg parsing logic
59-
let cli = parse_arguments(vec!["".to_string(), "file".to_string()]);
62+
let cli = parse_arguments(vec!["".to_string(), "file".to_string()]).unwrap();
6063
assert_eq!(cli.input_file, "file");
6164
}
65+
#[test]
66+
fn arg_parser_neg() {
67+
assert!(
68+
parse_arguments(vec![
69+
"".to_string(),
70+
"file".to_string(),
71+
"--lex".to_string(),
72+
"--codegen".to_string()
73+
])
74+
.is_err()
75+
);
76+
}
77+
// TODO can I test clap errors properly? Should I?
6278
}

0 commit comments

Comments
 (0)