fix(commands): add separate missing error for Token::Any to relay a better error message to user

This commit is contained in:
dusk 2025-01-12 05:35:04 +09:00
parent 8a01d7d37a
commit 58b5a26eca
No known key found for this signature in database
3 changed files with 20 additions and 3 deletions

View file

@ -27,7 +27,7 @@ pub fn cmds() -> impl Iterator<Item = Command> {
cfg,
autoproxy,
["timeout", "tm"],
[Disable("toggle"), Reset("reset"), FullString("timeout")]
[Disable("toggle"), Reset("reset"), FullString("timeout")] // todo: we should parse duration / time values
],
"cfg_ap_timeout_update",
"Sets the autoproxy timeout"

View file

@ -101,6 +101,21 @@ pub fn parse_command(prefix: String, input: String) -> CommandResult {
TokenMatchError::MissingParameter { name } => {
format!("Expected parameter `{name}` in command `{prefix}{input} {token}`.")
}
TokenMatchError::MissingAny { tokens } => {
let mut msg = format!("Expected one of ");
for (idx, token) in tokens.iter().enumerate() {
write!(&mut msg, "`{token}`").expect("oom");
if idx < tokens.len() - 1 {
if tokens.len() > 2 && idx == tokens.len() - 2 {
msg.push_str(" or ");
} else {
msg.push_str(", ");
}
}
}
write!(&mut msg, " in command `{prefix}{input} {token}`.").expect("oom");
msg
}
};
return CommandResult::Err { error: error_msg };
}

View file

@ -48,6 +48,7 @@ pub enum Token {
#[derive(Debug)]
pub enum TokenMatchError {
MissingParameter { name: ParamName },
MissingAny { tokens: Vec<Token> },
}
#[derive(Debug)]
@ -108,8 +109,9 @@ impl Token {
Some(Err(TokenMatchError::MissingParameter { name: param_name }))
}
Self::Any(tokens) => tokens.is_empty().then_some(None).unwrap_or_else(|| {
let mut results = tokens.iter().map(|t| t.try_match(None));
results.find(|r| !matches!(r, None)).unwrap_or(None)
Some(Err(TokenMatchError::MissingAny {
tokens: tokens.clone(),
}))
}),
// everything else doesnt match if no input anyway
Token::Value(_) => None,