mirror of
https://github.com/nushell/nushell.git
synced 2025-05-31 23:26:11 +02:00
shows wrong item when each command runs to failed. (#6437)
* add --wrong-item for each command * fix test * show multiple errors at once
This commit is contained in:
parent
b88ace4cde
commit
f1e7a01b2e
@ -2,8 +2,8 @@ use nu_engine::{eval_block, CallExt};
|
|||||||
use nu_protocol::ast::Call;
|
use nu_protocol::ast::Call;
|
||||||
use nu_protocol::engine::{CaptureBlock, Command, EngineState, Stack};
|
use nu_protocol::engine::{CaptureBlock, Command, EngineState, Stack};
|
||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, Signature,
|
Category, Example, IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, ShellError,
|
||||||
Span, SyntaxShape, Value,
|
Signature, Span, SyntaxShape, Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -161,6 +161,7 @@ impl Command for Each {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let input_span = x.span();
|
||||||
match eval_block(
|
match eval_block(
|
||||||
&engine_state,
|
&engine_state,
|
||||||
&mut stack,
|
&mut stack,
|
||||||
@ -170,7 +171,10 @@ impl Command for Each {
|
|||||||
redirect_stderr,
|
redirect_stderr,
|
||||||
) {
|
) {
|
||||||
Ok(v) => v.into_value(span),
|
Ok(v) => v.into_value(span),
|
||||||
Err(error) => Value::Error { error },
|
Err(error) => {
|
||||||
|
let error = each_cmd_error(error, input_span);
|
||||||
|
Value::Error { error }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.into_pipeline_data(ctrlc)),
|
.into_pipeline_data(ctrlc)),
|
||||||
@ -212,6 +216,7 @@ impl Command for Each {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let input_span = x.span();
|
||||||
match eval_block(
|
match eval_block(
|
||||||
&engine_state,
|
&engine_state,
|
||||||
&mut stack,
|
&mut stack,
|
||||||
@ -221,7 +226,10 @@ impl Command for Each {
|
|||||||
redirect_stderr,
|
redirect_stderr,
|
||||||
) {
|
) {
|
||||||
Ok(v) => v.into_value(span),
|
Ok(v) => v.into_value(span),
|
||||||
Err(error) => Value::Error { error },
|
Err(error) => {
|
||||||
|
let error = each_cmd_error(error, input_span);
|
||||||
|
Value::Error { error }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.into_pipeline_data(ctrlc)),
|
.into_pipeline_data(ctrlc)),
|
||||||
@ -252,6 +260,13 @@ impl Command for Each {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn each_cmd_error(error_source: ShellError, input_span: Result<Span, ShellError>) -> ShellError {
|
||||||
|
if let Ok(span) = input_span {
|
||||||
|
return ShellError::EvalBlockWithInput(span, vec![error_source]);
|
||||||
|
}
|
||||||
|
error_source
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -765,6 +765,12 @@ Either make sure {0} is a string, or add a 'to_string' entry for it in ENV_CONVE
|
|||||||
#[error("Unexpected abbr component `{0}`.")]
|
#[error("Unexpected abbr component `{0}`.")]
|
||||||
#[diagnostic(code(nu::shell::unexpected_path_abbreviateion), url(docsrs))]
|
#[diagnostic(code(nu::shell::unexpected_path_abbreviateion), url(docsrs))]
|
||||||
UnexpectedAbbrComponent(String),
|
UnexpectedAbbrComponent(String),
|
||||||
|
|
||||||
|
// It should be only used by commands accepts block, and accept inputs from pipeline.
|
||||||
|
/// Failed to eval block with specific pipeline input.
|
||||||
|
#[error("Eval block failed with pipeline input")]
|
||||||
|
#[diagnostic(code(nu::shell::eval_block_with_input), url(docsrs))]
|
||||||
|
EvalBlockWithInput(#[label("Invalid item")] Span, #[related] Vec<ShellError>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::io::Error> for ShellError {
|
impl From<std::io::Error> for ShellError {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user