Add exit code to error record given to catch
This commit is contained in:
parent
854ca25004
commit
ee7478781e
|
@ -106,6 +106,7 @@ fn run_catch(
|
||||||
let error = intercept_block_control(error)?;
|
let error = intercept_block_control(error)?;
|
||||||
|
|
||||||
if let Some(catch) = catch {
|
if let Some(catch) = catch {
|
||||||
|
stack.set_last_error(&error);
|
||||||
let error = err_to_record(error, span);
|
let error = err_to_record(error, span);
|
||||||
let block = engine_state.get_block(catch.block_id);
|
let block = engine_state.get_block(catch.block_id);
|
||||||
// Put the error value in the positional closure var
|
// Put the error value in the positional closure var
|
||||||
|
@ -133,23 +134,28 @@ fn run_catch(
|
||||||
/// `Err` when flow control to bubble up with `?`
|
/// `Err` when flow control to bubble up with `?`
|
||||||
fn intercept_block_control(error: ShellError) -> Result<ShellError, ShellError> {
|
fn intercept_block_control(error: ShellError) -> Result<ShellError, ShellError> {
|
||||||
match error {
|
match error {
|
||||||
nu_protocol::ShellError::Break { .. } => Err(error),
|
ShellError::Break { .. } => Err(error),
|
||||||
nu_protocol::ShellError::Continue { .. } => Err(error),
|
ShellError::Continue { .. } => Err(error),
|
||||||
nu_protocol::ShellError::Return { .. } => Err(error),
|
ShellError::Return { .. } => Err(error),
|
||||||
_ => Ok(error),
|
_ => Ok(error),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert from `error` to [`Value::Record`] so the error information can be easily accessed in catch.
|
/// Convert from `error` to [`Value::Record`] so the error information can be easily accessed in catch.
|
||||||
fn err_to_record(error: ShellError, head: Span) -> Value {
|
fn err_to_record(error: ShellError, head: Span) -> Value {
|
||||||
Value::record(
|
let exit_code = error.external_exit_code();
|
||||||
record! {
|
|
||||||
"msg" => Value::string(error.to_string(), head),
|
let mut record = record! {
|
||||||
"debug" => Value::string(format!("{error:?}"), head),
|
"msg" => Value::string(error.to_string(), head),
|
||||||
"raw" => Value::error(error, head),
|
"debug" => Value::string(format!("{error:?}"), head),
|
||||||
},
|
"raw" => Value::error(error, head),
|
||||||
head,
|
};
|
||||||
)
|
|
||||||
|
if let Some(code) = exit_code {
|
||||||
|
record.push("exit_code", Value::int(code.item.into(), code.span));
|
||||||
|
}
|
||||||
|
|
||||||
|
Value::record(record, head)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user