Skip to content

Commit 0c39710

Browse files
committed
Bug fix
1 parent f7889aa commit 0c39710

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

rewatch/src/main.rs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use anyhow::Result;
2-
use clap::{Parser, error::ErrorKind};
2+
use clap::{CommandFactory, Parser, error::ErrorKind};
33
use log::LevelFilter;
44
use std::{env, io::Write, path::Path};
55

@@ -134,11 +134,19 @@ fn parse_cli(raw_args: Vec<String>) -> Result<cli::Cli, clap::Error> {
134134
}
135135

136136
fn should_default_to_build(err: &clap::Error, args: &[String]) -> bool {
137+
let first_non_global = first_non_global_arg(args);
138+
137139
match err.kind() {
138-
ErrorKind::MissingSubcommand | ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand => true,
139-
ErrorKind::UnknownArgument | ErrorKind::InvalidSubcommand => {
140-
args.iter().skip(1).any(|arg| !is_global_flag(arg))
140+
ErrorKind::MissingSubcommand | ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand => {
141+
match first_non_global {
142+
Some(arg) => !is_known_subcommand(arg),
143+
None => true,
144+
}
141145
}
146+
ErrorKind::UnknownArgument | ErrorKind::InvalidSubcommand => match first_non_global {
147+
Some(arg) if is_known_subcommand(arg) => false,
148+
_ => true,
149+
},
142150
_ => false,
143151
}
144152
}
@@ -174,6 +182,19 @@ fn is_global_flag(arg: &str) -> bool {
174182
)
175183
}
176184

185+
fn first_non_global_arg(args: &[String]) -> Option<&str> {
186+
args.iter()
187+
.skip(1)
188+
.find(|arg| !is_global_flag(arg))
189+
.map(|s| s.as_str())
190+
}
191+
192+
fn is_known_subcommand(arg: &str) -> bool {
193+
cli::Cli::command().get_subcommands().any(|subcommand| {
194+
subcommand.get_name() == arg || subcommand.get_all_aliases().any(|alias| alias == arg)
195+
})
196+
}
197+
177198
#[cfg(test)]
178199
mod tests {
179200
use super::*;
@@ -209,6 +230,12 @@ mod tests {
209230
assert!(matches!(cli.command, cli::Command::Watch(_)));
210231
}
211232

233+
#[test]
234+
fn invalid_option_for_subcommand_does_not_fallback() {
235+
let err = parse(&["rescript", "watch", "--no-timing"]).expect_err("expected watch parse failure");
236+
assert_eq!(err.kind(), ErrorKind::UnknownArgument);
237+
}
238+
212239
#[test]
213240
fn help_flag_does_not_default_to_build() {
214241
let err = parse(&["rescript", "--help"]).expect_err("expected clap help error");

0 commit comments

Comments
 (0)