feat: length condition

This commit is contained in:
iff 2023-08-16 14:27:40 +02:00
parent 35418e3b2b
commit 15c957e7da
3 changed files with 27 additions and 4 deletions

View file

@ -102,9 +102,12 @@ The placeholder is evaluated as following:
The suggestion can have additional conditions to check. To specify the conditions, add a `#[...]` at the first line (just like derive macros in Rust). Available conditions:
- `executable`: Check if the argument can be found by `which`
- `cmd_contains`: Check if the last user input contains the argument
- `err_contains`: Check if the error of the command contains the argument
- `executable`: Check whether the argument can be found by `which`
- `cmd_contains`: Check whether the last user input contains the argument
- `err_contains`: Check whether the error of the command contains the argument
- `length`: Check whether the given command has the length of the argument
- `min_length`: Check whether the given command has at least the length of the argument
- `max_length`: Check whether the given command has at most the length of the argument

View file

@ -101,6 +101,7 @@ fn gen_match_rules(rules: Vec<Rule>) -> TokenStream {
#(
for pattern in #patterns_tokens {
if error_msg.contains(pattern) {
let split_command = split_command(&last_command);
#suggestion_tokens;
};
})*
@ -169,6 +170,9 @@ fn eval_condition(condition: &str, arg: &str) -> TokenStream2 {
"executable" => quote!{check_executable(shell, #arg)},
"err_contains" => quote!{error_msg.contains(#arg)},
"cmd_contains" => quote!{last_command.contains(#arg)},
"min_length" => quote!{(split_command.len() >= #arg.parse::<usize>().unwrap())},
"length" => quote!{(split_command.len() == #arg.parse::<usize>().unwrap())},
"max_length" => quote!{(split_command.len() <= #arg.parse::<usize>().unwrap() + 1)},
_ => unreachable!("Unknown condition when evaluation condition: {}", condition),
}
}
@ -193,7 +197,6 @@ fn eval_suggest(suggest: &str) -> TokenStream2 {
quote! {
#(#opt_list)*
let split_command = split_command(&last_command);
return Some(format!{#suggest, #(#replace_list),*});
}
}

17
rules/c_typo.toml Normal file
View file

@ -0,0 +1,17 @@
command = "c"
[[match_err]]
pattern = [
"command not found",
"unknown command",
"nu::shell::external_command"
]
suggest = [
'''
#[length(2)]
cd {{command[1:]}} ''',
'''
#[min_length(3)]
cp {{command[1:]}} '''
]