Replace some PipelineMismatch by OnlySupportsThisInputType by shell error (#15447)

sub-issue of #10698 according to @sholderbach 

(Description largely edited, since the scope of the PR changed)

# Description
Context: `ShellError::OnlySupportsThisInputType` was a duplicate of
`ShellError::PipelineMismatch`

so I
- replaced some occurences of PipelineMismatch by
OnlySupportsThisInputType

For another PR
- replace the remaining occurences
- removed OnlySupportsThisInputType from nu-protocol

# User-Facing Changes
The error message will be different -> but consistent

# Tests + Formatting
OK

# After Submitting
Nothing required
This commit is contained in:
Loïc Riegel 2025-04-07 12:25:27 +02:00 committed by GitHub
parent e82df7c1c9
commit 639f4bd499
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 51 additions and 36 deletions

View File

@ -159,9 +159,10 @@ where
} }
(Value::Binary { .. }, Value::Int { .. }) | (Value::Int { .. }, Value::Binary { .. }) => { (Value::Binary { .. }, Value::Int { .. }) | (Value::Int { .. }, Value::Binary { .. }) => {
Value::error( Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "input, and argument, to be both int or both binary" exp_input_type: "input, and argument, to be both int or both binary"
.to_string(), .to_string(),
wrong_type: "int and binary".to_string(),
dst_span: rhs.span(), dst_span: rhs.span(),
src_span: span, src_span: span,
}, },

View File

@ -40,6 +40,7 @@ impl Command for SplitCellPath {
input: PipelineData, input: PipelineData,
) -> Result<PipelineData, ShellError> { ) -> Result<PipelineData, ShellError> {
let head = call.head; let head = call.head;
let input_type = input.get_type();
let src_span = match input { let src_span = match input {
// Early return on correct type and empty pipeline // Early return on correct type and empty pipeline
@ -54,8 +55,9 @@ impl Command for SplitCellPath {
PipelineData::ListStream(stream, ..) => stream.span(), PipelineData::ListStream(stream, ..) => stream.span(),
PipelineData::ByteStream(stream, ..) => stream.span(), PipelineData::ByteStream(stream, ..) => stream.span(),
}; };
Err(ShellError::PipelineMismatch { Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "cell-path".into(), exp_input_type: "cell-path".into(),
wrong_type: input_type.to_string(),
dst_span: head, dst_span: head,
src_span, src_span,
}) })

View File

@ -42,8 +42,9 @@ pub(crate) fn typecheck_merge(lhs: &Value, rhs: &Value, head: Span) -> Result<()
match (lhs.get_type(), rhs.get_type()) { match (lhs.get_type(), rhs.get_type()) {
(Type::Record { .. }, Type::Record { .. }) => Ok(()), (Type::Record { .. }, Type::Record { .. }) => Ok(()),
(_, _) if is_list_of_records(lhs) && is_list_of_records(rhs) => Ok(()), (_, _) if is_list_of_records(lhs) && is_list_of_records(rhs) => Ok(()),
_ => Err(ShellError::PipelineMismatch { other => Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "input and argument to be both record or both table".to_string(), exp_input_type: "input and argument to be both record or both table".to_string(),
wrong_type: format!("{} and {}", other.0, other.1).to_string(),
dst_span: head, dst_span: head,
src_span: lhs.span(), src_span: lhs.span(),
}), }),

View File

@ -174,8 +174,9 @@ impl Command for Move {
PipelineData::Value(Value::Record { val, .. }, ..) => { PipelineData::Value(Value::Record { val, .. }, ..) => {
Ok(move_record_columns(&val, &columns, &location, head)?.into_pipeline_data()) Ok(move_record_columns(&val, &columns, &location, head)?.into_pipeline_data())
} }
_ => Err(ShellError::PipelineMismatch { other => Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "record or table".to_string(), exp_input_type: "record or table".to_string(),
wrong_type: other.get_type().to_string(),
dst_span: head, dst_span: head,
src_span: Span::new(head.start, head.start), src_span: Span::new(head.start, head.start),
}), }),

View File

@ -184,9 +184,10 @@ impl Command for Sort {
dst_span: value.span(), dst_span: value.span(),
}) })
} }
_ => { ref other => {
return Err(ShellError::PipelineMismatch { return Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "record or list".to_string(), exp_input_type: "record or list".to_string(),
wrong_type: other.get_type().to_string(),
dst_span: call.head, dst_span: call.head,
src_span: value.span(), src_span: value.span(),
}) })

View File

@ -221,14 +221,21 @@ fn join_list(parts: &[Value], head: Span, span: Span, args: &Arguments) -> Value
Value::list(vals, span) Value::list(vals, span)
} }
Err(_) => Value::error( Err(ShellError::CantConvert { from_type, .. }) => Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string or record".into(), exp_input_type: "string or record".into(),
wrong_type: from_type,
dst_span: head, dst_span: head,
src_span: span, src_span: span,
}, },
span, span,
), ),
Err(_) => Value::error(
ShellError::NushellFailed {
msg: "failed to join path".into(),
},
span,
),
} }
} }
} }

View File

@ -51,21 +51,11 @@ fn handle_invalid_values(rest: Value, name: Span) -> Value {
fn err_from_value(rest: &Value, name: Span) -> ShellError { fn err_from_value(rest: &Value, name: Span) -> ShellError {
match rest { match rest {
Value::Error { error, .. } => *error.clone(), Value::Error { error, .. } => *error.clone(),
_ => { _ => ShellError::OnlySupportsThisInputType {
if rest.is_nothing() { exp_input_type: "string, record or list".into(),
ShellError::OnlySupportsThisInputType { wrong_type: rest.get_type().to_string(),
exp_input_type: "string, record or list".into(), dst_span: name,
wrong_type: "nothing".into(), src_span: rest.span(),
dst_span: name, },
src_span: rest.span(),
}
} else {
ShellError::PipelineMismatch {
exp_input_type: "string, row or list".into(),
dst_span: name,
src_span: rest.span(),
}
}
}
} }
} }

View File

@ -181,11 +181,14 @@ fn operate(
Value::List { vals, .. } => { Value::List { vals, .. } => {
let iter = vals.into_iter().map(move |val| { let iter = vals.into_iter().map(move |val| {
let span = val.span(); let span = val.span();
val.into_string().map_err(|_| ShellError::PipelineMismatch { let type_ = val.get_type();
exp_input_type: "string".into(), val.into_string()
dst_span: head, .map_err(|_| ShellError::OnlySupportsThisInputType {
src_span: span, exp_input_type: "string".into(),
}) wrong_type: type_.to_string(),
dst_span: head,
src_span: span,
})
}); });
let iter = ParseIter { let iter = ParseIter {
@ -199,8 +202,9 @@ fn operate(
Ok(ListStream::new(iter, head, Signals::empty()).into()) Ok(ListStream::new(iter, head, Signals::empty()).into())
} }
value => Err(ShellError::PipelineMismatch { value => Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: value.get_type().to_string(),
dst_span: head, dst_span: head,
src_span: value.span(), src_span: value.span(),
}), }),

View File

@ -153,8 +153,9 @@ fn split_chars_helper(v: &Value, name: Span, graphemes: bool) -> Value {
) )
} else { } else {
Value::error( Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: v.get_type().to_string(),
dst_span: name, dst_span: name,
src_span: v_span, src_span: v_span,
}, },

View File

@ -255,8 +255,9 @@ fn split_column_helper(
v => { v => {
let span = v.span(); let span = v.span();
vec![Value::error( vec![Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: v.get_type().to_string(),
dst_span: head, dst_span: head,
src_span: span, src_span: span,
}, },

View File

@ -219,8 +219,9 @@ fn split_row_helper(v: &Value, regex: &Regex, max_split: Option<usize>, name: Sp
} }
} else { } else {
vec![Value::error( vec![Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: v.get_type().to_string(),
dst_span: name, dst_span: name,
src_span: v_span, src_span: v_span,
}, },

View File

@ -226,8 +226,9 @@ fn split_words_helper(v: &Value, word_length: Option<usize>, span: Span, graphem
Value::list(words, v_span) Value::list(words, v_span)
} else { } else {
Value::error( Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: v.get_type().to_string(),
dst_span: span, dst_span: span,
src_span: v_span, src_span: v_span,
}, },

View File

@ -237,14 +237,16 @@ fn run(
input.map( input.map(
move |v| { move |v| {
let value_span = v.span(); let value_span = v.span();
let type_ = v.get_type();
match v.coerce_into_string() { match v.coerce_into_string() {
Ok(s) => { Ok(s) => {
let contents = if is_path { s.replace('\\', "\\\\") } else { s }; let contents = if is_path { s.replace('\\', "\\\\") } else { s };
str_expand(&contents, span, value_span) str_expand(&contents, span, value_span)
} }
Err(_) => Value::error( Err(_) => Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: type_.to_string(),
dst_span: span, dst_span: span,
src_span: value_span, src_span: value_span,
}, },

View File

@ -108,6 +108,7 @@ fn stats(
input.map( input.map(
move |v| { move |v| {
let value_span = v.span(); let value_span = v.span();
let type_ = v.get_type();
// First, obtain the span. If this fails, propagate the error that results. // First, obtain the span. If this fails, propagate the error that results.
if let Value::Error { error, .. } = v { if let Value::Error { error, .. } = v {
return Value::error(*error, span); return Value::error(*error, span);
@ -116,8 +117,9 @@ fn stats(
match v.coerce_into_string() { match v.coerce_into_string() {
Ok(s) => counter(&s, span), Ok(s) => counter(&s, span),
Err(_) => Value::error( Err(_) => Value::error(
ShellError::PipelineMismatch { ShellError::OnlySupportsThisInputType {
exp_input_type: "string".into(), exp_input_type: "string".into(),
wrong_type: type_.to_string(),
dst_span: span, dst_span: span,
src_span: value_span, src_span: value_span,
}, },