Reject incombatible flag combinations in to nuon

Follow up to #12591

Ensure an error is shown.

`.expect` is fine here as the precondition of reaching each branch is
explicitly that this flag has been found. Only extra care has to be
taken when changing the flag name. But that is the general risk of this
stringly typed API.
This commit is contained in:
sholderbach 2024-04-20 19:58:08 +02:00
parent cf8fcef9bf
commit 52138c0c7a

View File

@ -42,14 +42,38 @@ impl Command for ToNuon {
call: &Call,
input: PipelineData,
) -> Result<PipelineData, ShellError> {
let style = if call.has_flag(engine_state, stack, "raw")? {
nuon::ToStyle::Raw
} else if let Some(t) = call.get_flag(engine_state, stack, "tabs")? {
nuon::ToStyle::Tabs(t)
} else if let Some(i) = call.get_flag(engine_state, stack, "indent")? {
nuon::ToStyle::Spaces(i)
} else {
nuon::ToStyle::Raw
let raw_flag = call.has_flag(engine_state, stack, "raw")?;
let tabs_flag = call.get_flag(engine_state, stack, "tabs")?;
let indent_flag = call.get_flag(engine_state, stack, "indent")?;
let style = match (raw_flag, tabs_flag, indent_flag) {
(true, None, None) => nuon::ToStyle::Raw,
(false, None, None) => nuon::ToStyle::Raw,
(false, None, Some(indent)) => nuon::ToStyle::Spaces(indent),
(false, Some(n_tabs), None) => nuon::ToStyle::Tabs(n_tabs),
(true, None, Some(_)) => {
return Err(ShellError::IncompatibleParameters {
left_message: "can't use `--indent` at the same time".into(),
left_span: call.get_named_arg("indent").expect("has flag").span,
right_message: "because of `--raw`".into(),
right_span: call.get_named_arg("raw").expect("has flag").span,
});
}
(true, Some(_), _) => {
return Err(ShellError::IncompatibleParameters {
left_message: "can't use `--tabs` at the same time".into(),
left_span: call.get_named_arg("tabs").expect("has flag").span,
right_message: "because of `--raw`".into(),
right_span: call.get_named_arg("raw").expect("has flag").span,
});
}
(false, Some(_), Some(_)) => {
return Err(ShellError::IncompatibleParameters {
left_message: "can't use `--indent` at the same time".into(),
left_span: call.get_named_arg("indent").expect("has flag").span,
right_message: "because of `--tabs`".into(),
right_span: call.get_named_arg("tabs").expect("has flag").span,
});
}
};
let span = call.head;