From 1e3e034021705592470cc06c88edd00140a4a096 Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:48:05 +1200 Subject: [PATCH] Spanned Value step 1: span all value cases (#10042) # Description This doesn't really do much that the user could see, but it helps get us ready to do the steps of the refactor to split the span off of Value, so that values can be spanless. This allows us to have top-level values that can hold both a Value and a Span, without requiring that all values have them. We expect to see significant memory reduction by removing so many unnecessary spans from values. For example, a table of 100,000 rows and 5 columns would have a savings of ~8megs in just spans that are almost always duplicated. # User-Facing Changes Nothing yet # Tests + Formatting # After Submitting --- crates/nu-cli/src/commands/commandline.rs | 2 +- crates/nu-cli/src/eval_file.rs | 4 +- crates/nu-cli/src/nu_highlight.rs | 1 + crates/nu-cli/src/reedline_config.rs | 30 +- crates/nu-cmd-base/src/input_handler.rs | 1 + .../src/dataframe/eager/filter_with.rs | 2 +- .../src/dataframe/eager/rename.rs | 2 +- .../src/dataframe/eager/summary.rs | 11 +- .../src/dataframe/eager/take.rs | 2 +- .../src/dataframe/eager/with_column.rs | 4 +- .../src/dataframe/lazy/fill_nan.rs | 2 +- .../src/dataframe/lazy/groupby.rs | 2 +- .../src/dataframe/lazy/join.rs | 4 +- .../src/dataframe/lazy/sort_by_expr.rs | 2 +- .../dataframe/series/indexes/set_with_idx.rs | 4 +- .../src/dataframe/series/masks/is_in.rs | 2 +- .../src/dataframe/series/masks/set.rs | 4 +- .../dataframe/series/string/concatenate.rs | 2 +- .../nu-cmd-dataframe/src/dataframe/utils.rs | 2 +- .../values/nu_dataframe/between_values.rs | 96 +++---- .../values/nu_dataframe/conversion.rs | 4 + .../src/dataframe/values/nu_dataframe/mod.rs | 6 +- .../values/nu_expression/custom_value.rs | 6 +- .../src/dataframe/values/nu_expression/mod.rs | 4 +- .../src/dataframe/values/nu_lazyframe/mod.rs | 4 +- .../dataframe/values/nu_lazygroupby/mod.rs | 2 +- .../src/dataframe/values/nu_when/mod.rs | 2 +- .../src/dataframe/values/utils.rs | 4 +- crates/nu-cmd-extra/src/extra/bits/and.rs | 3 +- crates/nu-cmd-extra/src/extra/bits/into.rs | 3 +- crates/nu-cmd-extra/src/extra/bits/not.rs | 3 +- crates/nu-cmd-extra/src/extra/bits/or.rs | 3 +- .../src/extra/bits/rotate_left.rs | 4 +- .../src/extra/bits/rotate_right.rs | 4 +- .../nu-cmd-extra/src/extra/bits/shift_left.rs | 5 +- .../src/extra/bits/shift_right.rs | 5 +- crates/nu-cmd-extra/src/extra/bits/xor.rs | 3 +- .../nu-cmd-extra/src/extra/conversions/fmt.rs | 3 +- .../src/extra/filters/roll/mod.rs | 4 +- .../src/extra/filters/update_cells.rs | 5 +- crates/nu-cmd-extra/src/extra/math/arccos.rs | 4 +- crates/nu-cmd-extra/src/extra/math/arccosh.rs | 4 +- crates/nu-cmd-extra/src/extra/math/arcsin.rs | 4 +- crates/nu-cmd-extra/src/extra/math/arcsinh.rs | 3 +- crates/nu-cmd-extra/src/extra/math/arctan.rs | 3 +- crates/nu-cmd-extra/src/extra/math/arctanh.rs | 4 +- crates/nu-cmd-extra/src/extra/math/cos.rs | 3 +- crates/nu-cmd-extra/src/extra/math/cosh.rs | 3 +- crates/nu-cmd-extra/src/extra/math/exp.rs | 3 +- crates/nu-cmd-extra/src/extra/math/ln.rs | 4 +- crates/nu-cmd-extra/src/extra/math/sin.rs | 3 +- crates/nu-cmd-extra/src/extra/math/sinh.rs | 3 +- crates/nu-cmd-extra/src/extra/math/tan.rs | 3 +- crates/nu-cmd-extra/src/extra/math/tanh.rs | 3 +- .../src/extra/platform/ansi/gradient.rs | 5 +- .../src/extra/platform/ansi/link.rs | 13 +- .../src/extra/strings/encode_decode/hex.rs | 11 +- .../src/extra/strings/format/command.rs | 10 +- .../src/extra/strings/str_/case/mod.rs | 3 +- crates/nu-cmd-lang/src/core_commands/do_.rs | 2 +- .../src/core_commands/error_make.rs | 7 +- crates/nu-cmd-lang/src/core_commands/if_.rs | 2 +- crates/nu-cmd-lang/src/core_commands/try_.rs | 4 +- .../nu-cmd-lang/src/core_commands/while_.rs | 2 +- crates/nu-command/src/bytes/add.rs | 3 +- crates/nu-command/src/bytes/at.rs | 4 +- crates/nu-command/src/bytes/build_.rs | 4 +- crates/nu-command/src/bytes/collect.rs | 4 +- crates/nu-command/src/bytes/ends_with.rs | 3 +- crates/nu-command/src/bytes/index_of.rs | 3 +- crates/nu-command/src/bytes/length.rs | 3 +- crates/nu-command/src/bytes/remove.rs | 3 +- crates/nu-command/src/bytes/replace.rs | 3 +- crates/nu-command/src/bytes/reverse.rs | 3 +- crates/nu-command/src/bytes/starts_with.rs | 6 +- .../nu-command/src/charting/hashable_value.rs | 5 +- crates/nu-command/src/charting/histogram.rs | 8 +- crates/nu-command/src/conversions/fill.rs | 3 +- .../nu-command/src/conversions/into/binary.rs | 3 +- .../nu-command/src/conversions/into/bool.rs | 4 +- .../src/conversions/into/datetime.rs | 10 +- .../src/conversions/into/decimal.rs | 4 +- .../src/conversions/into/duration.rs | 7 +- .../src/conversions/into/filesize.rs | 62 ++--- crates/nu-command/src/conversions/into/int.rs | 20 +- .../nu-command/src/conversions/into/record.rs | 3 +- .../nu-command/src/conversions/into/string.rs | 5 +- .../src/database/commands/into_sqlite.rs | 6 +- .../nu-command/src/database/values/sqlite.rs | 3 +- crates/nu-command/src/date/humanize.rs | 1 + crates/nu-command/src/date/to_record.rs | 1 + crates/nu-command/src/date/to_table.rs | 1 + crates/nu-command/src/date/to_timezone.rs | 2 + crates/nu-command/src/date/utils.rs | 2 + crates/nu-command/src/debug/explain.rs | 11 +- crates/nu-command/src/debug/metadata.rs | 23 +- crates/nu-command/src/debug/view_source.rs | 2 +- crates/nu-command/src/filesystem/cp.rs | 4 + crates/nu-command/src/filesystem/glob.rs | 6 +- crates/nu-command/src/filesystem/ls.rs | 2 + crates/nu-command/src/filesystem/mv.rs | 1 + crates/nu-command/src/filesystem/rm.rs | 3 + crates/nu-command/src/filesystem/save.rs | 6 +- crates/nu-command/src/filters/columns.rs | 4 +- crates/nu-command/src/filters/drop/nth.rs | 2 +- crates/nu-command/src/filters/each.rs | 15 +- crates/nu-command/src/filters/filter.rs | 10 +- crates/nu-command/src/filters/find.rs | 20 +- crates/nu-command/src/filters/first.rs | 4 +- crates/nu-command/src/filters/flatten.rs | 21 +- crates/nu-command/src/filters/headers.rs | 6 +- crates/nu-command/src/filters/insert.rs | 15 +- crates/nu-command/src/filters/items.rs | 10 +- crates/nu-command/src/filters/last.rs | 4 +- crates/nu-command/src/filters/length.rs | 2 +- crates/nu-command/src/filters/lines.rs | 9 +- crates/nu-command/src/filters/merge.rs | 6 +- crates/nu-command/src/filters/move_.rs | 8 +- crates/nu-command/src/filters/par_each.rs | 23 +- crates/nu-command/src/filters/rename.rs | 20 +- crates/nu-command/src/filters/select.rs | 8 +- crates/nu-command/src/filters/split_by.rs | 2 +- crates/nu-command/src/filters/take/take_.rs | 4 +- crates/nu-command/src/filters/transpose.rs | 4 +- crates/nu-command/src/filters/update.rs | 22 +- crates/nu-command/src/filters/upsert.rs | 15 +- crates/nu-command/src/filters/utils.rs | 5 +- crates/nu-command/src/filters/values.rs | 6 +- crates/nu-command/src/filters/where_.rs | 1 + crates/nu-command/src/formats/from/json.rs | 2 + crates/nu-command/src/formats/from/ods.rs | 10 +- crates/nu-command/src/formats/from/xlsx.rs | 8 +- crates/nu-command/src/formats/to/delimited.rs | 8 +- crates/nu-command/src/formats/to/json.rs | 3 +- crates/nu-command/src/formats/to/nuon.rs | 15 +- crates/nu-command/src/formats/to/text.rs | 2 +- crates/nu-command/src/formats/to/toml.rs | 7 +- crates/nu-command/src/formats/to/xml.rs | 10 +- crates/nu-command/src/formats/to/yaml.rs | 3 +- crates/nu-command/src/generators/seq_date.rs | 2 +- crates/nu-command/src/hash/generic_digest.rs | 15 +- crates/nu-command/src/help/help_.rs | 2 +- crates/nu-command/src/hook.rs | 16 +- crates/nu-command/src/math/abs.rs | 3 +- crates/nu-command/src/math/ceil.rs | 3 +- crates/nu-command/src/math/floor.rs | 3 +- crates/nu-command/src/math/log.rs | 4 +- crates/nu-command/src/math/median.rs | 4 +- crates/nu-command/src/math/mode.rs | 8 +- crates/nu-command/src/math/reducers.rs | 16 +- crates/nu-command/src/math/round.rs | 3 +- crates/nu-command/src/math/sqrt.rs | 4 +- crates/nu-command/src/math/utils.rs | 4 +- crates/nu-command/src/math/variance.rs | 4 +- crates/nu-command/src/network/http/client.rs | 6 +- crates/nu-command/src/network/http/delete.rs | 2 +- crates/nu-command/src/network/http/get.rs | 2 +- crates/nu-command/src/network/http/head.rs | 2 +- crates/nu-command/src/network/http/options.rs | 2 +- crates/nu-command/src/network/http/patch.rs | 2 +- crates/nu-command/src/network/http/post.rs | 2 +- crates/nu-command/src/network/http/put.rs | 2 +- .../nu-command/src/network/url/build_query.rs | 4 +- crates/nu-command/src/network/url/encode.rs | 6 +- crates/nu-command/src/network/url/join.rs | 18 +- crates/nu-command/src/network/url/parse.rs | 2 +- crates/nu-command/src/path/exists.rs | 1 + crates/nu-command/src/path/expand.rs | 1 + crates/nu-command/src/path/join.rs | 2 + crates/nu-command/src/path/mod.rs | 11 +- crates/nu-command/src/path/relative_to.rs | 1 + crates/nu-command/src/platform/ansi/ansi_.rs | 4 +- crates/nu-command/src/platform/ansi/strip.rs | 5 +- crates/nu-command/src/platform/du.rs | 5 +- .../src/platform/input/input_listen.rs | 2 +- .../nu-command/src/strings/detect_columns.rs | 1 + .../src/strings/encode_decode/base64.rs | 15 +- .../src/strings/encode_decode/decode.rs | 4 +- .../src/strings/encode_decode/encode.rs | 4 +- crates/nu-command/src/strings/format/date.rs | 3 + .../nu-command/src/strings/format/duration.rs | 8 +- .../nu-command/src/strings/format/filesize.rs | 3 +- crates/nu-command/src/strings/parse.rs | 16 +- crates/nu-command/src/strings/size.rs | 12 +- crates/nu-command/src/strings/split/chars.rs | 13 +- crates/nu-command/src/strings/split/column.rs | 29 +- crates/nu-command/src/strings/split/list.rs | 4 +- crates/nu-command/src/strings/split/row.rs | 16 +- crates/nu-command/src/strings/split/words.rs | 13 +- .../src/strings/str_/case/capitalize.rs | 4 +- .../src/strings/str_/case/downcase.rs | 4 +- .../nu-command/src/strings/str_/case/mod.rs | 3 +- .../src/strings/str_/case/upcase.rs | 4 +- .../nu-command/src/strings/str_/contains.rs | 3 +- .../nu-command/src/strings/str_/distance.rs | 3 +- .../nu-command/src/strings/str_/ends_with.rs | 3 +- crates/nu-command/src/strings/str_/expand.rs | 23 +- .../nu-command/src/strings/str_/index_of.rs | 4 +- crates/nu-command/src/strings/str_/join.rs | 2 +- crates/nu-command/src/strings/str_/length.rs | 3 +- crates/nu-command/src/strings/str_/replace.rs | 4 +- crates/nu-command/src/strings/str_/reverse.rs | 3 +- .../src/strings/str_/starts_with.rs | 3 +- .../nu-command/src/strings/str_/substring.rs | 4 +- .../nu-command/src/strings/str_/trim/trim_.rs | 3 +- crates/nu-command/src/system/run_external.rs | 3 +- crates/nu-command/src/viewers/table.rs | 2 +- crates/nu-command/tests/commands/length.rs | 2 +- crates/nu-engine/src/env.rs | 33 +-- crates/nu-engine/src/eval.rs | 53 ++-- crates/nu-explore/src/explore.rs | 1 + crates/nu-explore/src/nu_common/command.rs | 2 +- crates/nu-explore/src/nu_common/value.rs | 2 + crates/nu-parser/src/eval.rs | 8 +- crates/nu-protocol/src/config.rs | 56 ++-- .../nu-protocol/src/engine/pattern_match.rs | 5 +- crates/nu-protocol/src/pipeline_data.rs | 31 ++- crates/nu-protocol/src/value/from.rs | 4 +- crates/nu-protocol/src/value/from_value.rs | 64 ++--- crates/nu-protocol/src/value/mod.rs | 261 +++++++++--------- crates/nu-protocol/src/value/range.rs | 4 +- crates/nu-protocol/src/value/stream.rs | 4 +- crates/nu-protocol/src/value/unit.rs | 138 +++++---- crates/nu-protocol/tests/test_value.rs | 2 +- crates/nu-table/src/types/collapse.rs | 4 +- crates/nu-table/src/types/expanded.rs | 6 +- crates/nu-table/src/types/general.rs | 4 +- .../src/cool_custom_value.rs | 2 +- .../src/second_custom_value.rs | 2 +- crates/nu_plugin_formats/src/from/ics.rs | 3 +- crates/nu_plugin_formats/src/from/ini.rs | 2 +- crates/nu_plugin_formats/src/from/vcf.rs | 3 +- crates/nu_plugin_gstat/src/gstat.rs | 8 +- crates/nu_plugin_query/src/query_web.rs | 2 +- 234 files changed, 1153 insertions(+), 868 deletions(-) diff --git a/crates/nu-cli/src/commands/commandline.rs b/crates/nu-cli/src/commands/commandline.rs index 5945fc86f..646b5cd12 100644 --- a/crates/nu-cli/src/commands/commandline.rs +++ b/crates/nu-cli/src/commands/commandline.rs @@ -84,7 +84,7 @@ impl Command for Commandline { return Err(ShellError::CantConvert { to_type: "int".to_string(), from_type: "string".to_string(), - span: cmd.span()?, + span: cmd.span(), help: Some(format!( r#"string "{cmd_str}" does not represent a valid integer"# )), diff --git a/crates/nu-cli/src/eval_file.rs b/crates/nu-cli/src/eval_file.rs index e28de2f08..748b92d4b 100644 --- a/crates/nu-cli/src/eval_file.rs +++ b/crates/nu-cli/src/eval_file.rs @@ -185,7 +185,7 @@ pub(crate) fn print_table_or_error( // Change the engine_state config to use the passed in configuration engine_state.set_config(config); - if let PipelineData::Value(Value::Error { error }, ..) = &pipeline_data { + if let PipelineData::Value(Value::Error { error, .. }, ..) = &pipeline_data { let working_set = StateWorkingSet::new(engine_state); report_error(&working_set, &**error); std::process::exit(1); @@ -232,7 +232,7 @@ pub(crate) fn print_table_or_error( fn print_or_exit(pipeline_data: PipelineData, engine_state: &mut EngineState, config: &Config) { for item in pipeline_data { - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { let working_set = StateWorkingSet::new(engine_state); report_error(&working_set, &*error); diff --git a/crates/nu-cli/src/nu_highlight.rs b/crates/nu-cli/src/nu_highlight.rs index 1e8df9f71..a8557ba0a 100644 --- a/crates/nu-cli/src/nu_highlight.rs +++ b/crates/nu-cli/src/nu_highlight.rs @@ -55,6 +55,7 @@ impl Command for NuHighlight { } Err(err) => Value::Error { error: Box::new(err), + span: head, }, }, ctrlc, diff --git a/crates/nu-cli/src/reedline_config.rs b/crates/nu-cli/src/reedline_config.rs index fad763503..7916e99e8 100644 --- a/crates/nu-cli/src/reedline_config.rs +++ b/crates/nu-cli/src/reedline_config.rs @@ -141,14 +141,14 @@ fn add_menu( _ => Err(ShellError::UnsupportedConfigValue( "columnar, list or description".to_string(), menu.menu_type.into_abbreviated_string(config), - menu.menu_type.span()?, + menu.menu_type.span(), )), } } else { Err(ShellError::UnsupportedConfigValue( "only record type".to_string(), menu.menu_type.into_abbreviated_string(config), - menu.menu_type.span()?, + menu.menu_type.span(), )) } } @@ -264,7 +264,7 @@ pub(crate) fn add_columnar_menu( _ => Err(ShellError::UnsupportedConfigValue( "block or omitted value".to_string(), menu.source.into_abbreviated_string(config), - menu.source.span()?, + menu.source.span(), )), } } @@ -347,7 +347,7 @@ pub(crate) fn add_list_menu( _ => Err(ShellError::UnsupportedConfigValue( "block or omitted value".to_string(), menu.source.into_abbreviated_string(config), - menu.source.span()?, + menu.source.span(), )), } } @@ -466,7 +466,7 @@ pub(crate) fn add_description_menu( _ => Err(ShellError::UnsupportedConfigValue( "closure or omitted value".to_string(), menu.source.into_abbreviated_string(config), - menu.source.span()?, + menu.source.span(), )), } } @@ -603,7 +603,7 @@ fn add_keybinding( v => Err(ShellError::UnsupportedConfigValue( "string or list of strings".to_string(), v.into_abbreviated_string(config), - v.span()?, + v.span(), )), } } @@ -633,7 +633,7 @@ fn add_parsed_keybinding( return Err(ShellError::UnsupportedConfigValue( "CONTROL, SHIFT, ALT or NONE".to_string(), keybinding.modifier.into_abbreviated_string(config), - keybinding.modifier.span()?, + keybinding.modifier.span(), )) } }; @@ -657,7 +657,7 @@ fn add_parsed_keybinding( return Err(ShellError::UnsupportedConfigValue( "char_".to_string(), c.to_string(), - keybinding.keycode.span()?, + keybinding.keycode.span(), )); }; @@ -684,7 +684,7 @@ fn add_parsed_keybinding( .ok_or(ShellError::UnsupportedConfigValue( "(f1|f2|...|f20)".to_string(), format!("unknown function key: {c}"), - keybinding.keycode.span()?, + keybinding.keycode.span(), ))?; KeyCode::F(fn_num) } @@ -694,7 +694,7 @@ fn add_parsed_keybinding( return Err(ShellError::UnsupportedConfigValue( "crossterm KeyCode".to_string(), keybinding.keycode.into_abbreviated_string(config), - keybinding.keycode.span()?, + keybinding.keycode.span(), )) } }; @@ -751,7 +751,7 @@ fn parse_event(value: &Value, config: &Config) -> Result, None => Err(ShellError::UnsupportedConfigValue( "List containing valid events".to_string(), "Nothing value (null)".to_string(), - value.span()?, + value.span(), )), Some(event) => Ok(event), }, @@ -764,7 +764,7 @@ fn parse_event(value: &Value, config: &Config) -> Result, v => Err(ShellError::UnsupportedConfigValue( "list of events".to_string(), v.into_abbreviated_string(config), - v.span()?, + v.span(), )), }, }, @@ -776,7 +776,7 @@ fn parse_event(value: &Value, config: &Config) -> Result, None => Err(ShellError::UnsupportedConfigValue( "List containing valid events".to_string(), "Nothing value (null)".to_string(), - value.span()?, + value.span(), )), Some(event) => Ok(event), }, @@ -790,7 +790,7 @@ fn parse_event(value: &Value, config: &Config) -> Result, v => Err(ShellError::UnsupportedConfigValue( "record or list of records, null to unbind key".to_string(), v.into_abbreviated_string(config), - v.span()?, + v.span(), )), } } @@ -965,7 +965,7 @@ fn edit_from_record( } fn extract_char(value: &Value, config: &Config) -> Result { - let span = value.span()?; + let span = value.span(); value .into_string("", config) .chars() diff --git a/crates/nu-cmd-base/src/input_handler.rs b/crates/nu-cmd-base/src/input_handler.rs index 73b831af8..70e063f41 100644 --- a/crates/nu-cmd-base/src/input_handler.rs +++ b/crates/nu-cmd-base/src/input_handler.rs @@ -78,6 +78,7 @@ where if let Err(error) = r { return Value::Error { error: Box::new(error), + span, }; } } diff --git a/crates/nu-cmd-dataframe/src/dataframe/eager/filter_with.rs b/crates/nu-cmd-dataframe/src/dataframe/eager/filter_with.rs index 88c40e336..e302ee24b 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/eager/filter_with.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/eager/filter_with.rs @@ -92,7 +92,7 @@ fn command_eager( df: NuDataFrame, ) -> Result { let mask_value: Value = call.req(engine_state, stack, 0)?; - let mask_span = mask_value.span()?; + let mask_span = mask_value.span(); if NuExpression::can_downcast(&mask_value) { let expression = NuExpression::try_from_value(mask_value)?; diff --git a/crates/nu-cmd-dataframe/src/dataframe/eager/rename.rs b/crates/nu-cmd-dataframe/src/dataframe/eager/rename.rs index 67cd8649f..9729b6d43 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/eager/rename.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/eager/rename.rs @@ -160,7 +160,7 @@ fn command_lazy( let value: Value = call.req(engine_state, stack, 1)?; return Err(ShellError::IncompatibleParametersSingle { msg: "New name list has different size to column list".into(), - span: value.span()?, + span: value.span(), }); } diff --git a/crates/nu-cmd-dataframe/src/dataframe/eager/summary.rs b/crates/nu-cmd-dataframe/src/dataframe/eager/summary.rs index 7f30ed1b2..f92cb0a0b 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/eager/summary.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/eager/summary.rs @@ -134,16 +134,17 @@ fn command( )) } } - _ => match value.span() { - Ok(span) => Err(ShellError::GenericError( + Value::Error { error, .. } => Err(*error.clone()), + _ => { + let span = value.span(); + Err(ShellError::GenericError( "Incorrect value for quantile".to_string(), "value should be a float".to_string(), Some(span), None, Vec::new(), - )), - Err(e) => Err(e), - }, + )) + } }) .collect::, ShellError>>() }); diff --git a/crates/nu-cmd-dataframe/src/dataframe/eager/take.rs b/crates/nu-cmd-dataframe/src/dataframe/eager/take.rs index 4d2a4681f..99b314c3b 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/eager/take.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/eager/take.rs @@ -93,7 +93,7 @@ fn command( input: PipelineData, ) -> Result { let index_value: Value = call.req(engine_state, stack, 0)?; - let index_span = index_value.span()?; + let index_span = index_value.span(); let index = NuDataFrame::try_from_value(index_value)?.as_series(index_span)?; let casted = match index.dtype() { diff --git a/crates/nu-cmd-dataframe/src/dataframe/eager/with_column.rs b/crates/nu-cmd-dataframe/src/dataframe/eager/with_column.rs index 17b195ec5..53e57501e 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/eager/with_column.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/eager/with_column.rs @@ -114,7 +114,7 @@ impl Command for WithColumn { Err(ShellError::CantConvert { to_type: "lazy or eager dataframe".into(), from_type: value.get_type().to_string(), - span: value.span()?, + span: value.span(), help: None, }) } @@ -128,7 +128,7 @@ fn command_eager( mut df: NuDataFrame, ) -> Result { let new_column: Value = call.req(engine_state, stack, 0)?; - let column_span = new_column.span()?; + let column_span = new_column.span(); if NuExpression::can_downcast(&new_column) { let vals: Vec = call.rest(engine_state, stack, 0)?; diff --git a/crates/nu-cmd-dataframe/src/dataframe/lazy/fill_nan.rs b/crates/nu-cmd-dataframe/src/dataframe/lazy/fill_nan.rs index 9406fe344..bc5f9ec18 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/lazy/fill_nan.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/lazy/fill_nan.rs @@ -93,7 +93,7 @@ impl Command for LazyFillNA { None, )) } else { - let val_span = value.span()?; + let val_span = value.span(); let frame = NuDataFrame::try_from_value(value)?; let columns = frame.columns(val_span)?; let dataframe = columns diff --git a/crates/nu-cmd-dataframe/src/dataframe/lazy/groupby.rs b/crates/nu-cmd-dataframe/src/dataframe/lazy/groupby.rs index 99d489781..9a1a2bb88 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/lazy/groupby.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/lazy/groupby.rs @@ -126,7 +126,7 @@ impl Command for ToLazyGroupBy { let value: Value = call.req(engine_state, stack, 0)?; return Err(ShellError::IncompatibleParametersSingle { msg: "Expected only Col expressions".into(), - span: value.span()?, + span: value.span(), }); } diff --git a/crates/nu-cmd-dataframe/src/dataframe/lazy/join.rs b/crates/nu-cmd-dataframe/src/dataframe/lazy/join.rs index 58f4d6be8..e51cc84ad 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/lazy/join.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/lazy/join.rs @@ -199,7 +199,7 @@ impl Command for LazyJoin { let right_on: Value = call.req(engine_state, stack, 2)?; return Err(ShellError::IncompatibleParametersSingle { msg: "The right column list has a different size to the left column list".into(), - span: right_on.span()?, + span: right_on.span(), }); } @@ -209,7 +209,7 @@ impl Command for LazyJoin { let value: Value = call.req(engine_state, stack, *index)?; return Err(ShellError::IncompatibleParametersSingle { msg: "Expected only a string, col expressions or list of strings".into(), - span: value.span()?, + span: value.span(), }); } } diff --git a/crates/nu-cmd-dataframe/src/dataframe/lazy/sort_by_expr.rs b/crates/nu-cmd-dataframe/src/dataframe/lazy/sort_by_expr.rs index 5a3ca4e15..302117b15 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/lazy/sort_by_expr.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/lazy/sort_by_expr.rs @@ -118,7 +118,7 @@ impl Command for LazySortBy { let span = call .get_flag::(engine_state, stack, "reverse")? .expect("already checked and it exists") - .span()?; + .span(); return Err(ShellError::GenericError( "Incorrect list size".into(), "Size doesn't match expression list".into(), diff --git a/crates/nu-cmd-dataframe/src/dataframe/series/indexes/set_with_idx.rs b/crates/nu-cmd-dataframe/src/dataframe/series/indexes/set_with_idx.rs index 575111534..8731996b5 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/series/indexes/set_with_idx.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/series/indexes/set_with_idx.rs @@ -82,7 +82,7 @@ fn command( let indices_value: Value = call .get_flag(engine_state, stack, "indices")? .expect("required named value"); - let indices_span = indices_value.span()?; + let indices_span = indices_value.span(); let indices = NuDataFrame::try_from_value(indices_value)?.as_series(indices_span)?; let casted = match indices.dtype() { @@ -204,7 +204,7 @@ fn command( "this value cannot be set in a series of type '{}'", series.dtype() ), - Some(value.span()?), + Some(value.span()), None, Vec::new(), )), diff --git a/crates/nu-cmd-dataframe/src/dataframe/series/masks/is_in.rs b/crates/nu-cmd-dataframe/src/dataframe/series/masks/is_in.rs index 687b5e78d..f9a0dab39 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/series/masks/is_in.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/series/masks/is_in.rs @@ -74,7 +74,7 @@ fn command( let df = NuDataFrame::try_from_pipeline(input, call.head)?; let other_value: Value = call.req(engine_state, stack, 0)?; - let other_span = other_value.span()?; + let other_span = other_value.span(); let other_df = NuDataFrame::try_from_value(other_value)?; let other = other_df.as_series(other_span)?; diff --git a/crates/nu-cmd-dataframe/src/dataframe/series/masks/set.rs b/crates/nu-cmd-dataframe/src/dataframe/series/masks/set.rs index 2d2ed7206..d94866722 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/series/masks/set.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/series/masks/set.rs @@ -81,7 +81,7 @@ fn command( let mask_value: Value = call .get_flag(engine_state, stack, "mask")? .expect("required named value"); - let mask_span = mask_value.span()?; + let mask_span = mask_value.span(); let mask = NuDataFrame::try_from_value(mask_value)?.as_series(mask_span)?; let bool_mask = match mask.dtype() { @@ -185,7 +185,7 @@ fn command( "this value cannot be set in a series of type '{}'", series.dtype() ), - Some(value.span()?), + Some(value.span()), None, Vec::new(), )), diff --git a/crates/nu-cmd-dataframe/src/dataframe/series/string/concatenate.rs b/crates/nu-cmd-dataframe/src/dataframe/series/string/concatenate.rs index 1152bcad6..db9e371f0 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/series/string/concatenate.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/series/string/concatenate.rs @@ -74,7 +74,7 @@ fn command( let df = NuDataFrame::try_from_pipeline(input, call.head)?; let other: Value = call.req(engine_state, stack, 0)?; - let other_span = other.span()?; + let other_span = other.span(); let other_df = NuDataFrame::try_from_value(other)?; let other_series = other_df.as_series(other_span)?; diff --git a/crates/nu-cmd-dataframe/src/dataframe/utils.rs b/crates/nu-cmd-dataframe/src/dataframe/utils.rs index 982797cef..c7dc75eed 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/utils.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/utils.rs @@ -9,7 +9,7 @@ pub fn extract_strings(value: Value) -> Result, ShellError> { (Err(_), Ok(cols)) => Ok(cols), _ => Err(ShellError::IncompatibleParametersSingle { msg: "Expected a string or list of strings".into(), - span: value.span()?, + span: value.span(), }), } } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/between_values.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/between_values.rs index 88ba19d99..fccd9c81d 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/between_values.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/between_values.rs @@ -17,7 +17,7 @@ pub(super) fn between_dataframes( right: &Value, rhs: &NuDataFrame, ) -> Result { - let operation_span = span(&[left.span()?, right.span()?]); + let operation_span = span(&[left.span(), right.span()]); match operator.item { Operator::Math(Math::Plus) => match lhs.append_df(rhs, Axis::Row, operation_span) { Ok(df) => Ok(df.into_value(operation_span)), @@ -26,9 +26,9 @@ pub(super) fn between_dataframes( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), } } @@ -40,7 +40,7 @@ pub(super) fn compute_between_series( right: &Value, rhs: &Series, ) -> Result { - let operation_span = span(&[left.span()?, right.span()?]); + let operation_span = span(&[left.span(), right.span()]); match operator.item { Operator::Math(Math::Plus) => { let mut res = lhs + rhs; @@ -71,7 +71,7 @@ pub(super) fn compute_between_series( Err(e) => Err(ShellError::GenericError( "Division error".into(), e.to_string(), - Some(right.span()?), + Some(right.span()), None, Vec::new(), )), @@ -79,32 +79,32 @@ pub(super) fn compute_between_series( } Operator::Comparison(Comparison::Equal) => { let name = format!("eq_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Comparison(Comparison::NotEqual) => { let name = format!("neq_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Comparison(Comparison::LessThan) => { let name = format!("lt_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Comparison(Comparison::LessThanOrEqual) => { let name = format!("lte_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Comparison(Comparison::GreaterThan) => { let name = format!("gt_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Comparison(Comparison::GreaterThanOrEqual) => { let name = format!("gte_{}_{}", lhs.name(), rhs.name()); - let res = compare_series(lhs, rhs, name.as_str(), right.span().ok(), Series::equal)?; + let res = compare_series(lhs, rhs, name.as_str(), right.span(), Series::equal)?; NuDataFrame::series_to_value(res, operation_span) } Operator::Boolean(Boolean::And) => match lhs.dtype() { @@ -122,7 +122,7 @@ pub(super) fn compute_between_series( _ => Err(ShellError::GenericError( "Incompatible types".into(), "unable to cast to boolean".into(), - Some(right.span()?), + Some(right.span()), None, Vec::new(), )), @@ -151,7 +151,7 @@ pub(super) fn compute_between_series( _ => Err(ShellError::GenericError( "Incompatible types".into(), "unable to cast to boolean".into(), - Some(right.span()?), + Some(right.span()), None, Vec::new(), )), @@ -168,9 +168,9 @@ pub(super) fn compute_between_series( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), } } @@ -179,7 +179,7 @@ fn compare_series<'s, F>( lhs: &'s Series, rhs: &'s Series, name: &'s str, - span: Option, + span: Span, f: F, ) -> Result where @@ -190,7 +190,7 @@ where ShellError::GenericError( "Equality error".into(), e.to_string(), - span, + Some(span), None, Vec::new(), ) @@ -211,13 +211,13 @@ pub(super) fn compute_series_single_value( return Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }); } - let lhs_span = left.span()?; + let lhs_span = left.span(); let lhs = lhs.as_series(lhs_span)?; match operator.item { @@ -232,9 +232,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Math(Math::Minus) => match &right { @@ -247,9 +247,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Math(Math::Multiply) => match &right { @@ -262,9 +262,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Math(Math::Divide) => match &right { @@ -285,9 +285,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::Equal) => match &right { @@ -305,9 +305,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::NotEqual) => match &right { @@ -326,9 +326,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::LessThan) => match &right { @@ -342,9 +342,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::LessThanOrEqual) => match &right { @@ -358,9 +358,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::GreaterThan) => match &right { @@ -374,9 +374,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::GreaterThanOrEqual) => match &right { @@ -390,9 +390,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, // TODO: update this to do a regex match instead of a simple contains? @@ -401,9 +401,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::StartsWith) => match &right { @@ -414,9 +414,9 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, Operator::Comparison(Comparison::EndsWith) => match &right { @@ -427,17 +427,17 @@ pub(super) fn compute_series_single_value( _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), }, _ => Err(ShellError::OperatorMismatch { op_span: operator.span, lhs_ty: left.get_type().to_string(), - lhs_span: left.span()?, + lhs_span: left.span(), rhs_ty: right.get_type().to_string(), - rhs_span: right.span()?, + rhs_span: right.span(), }), } } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/conversion.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/conversion.rs index e4cc880ce..be536bdd8 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/conversion.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/conversion.rs @@ -882,6 +882,7 @@ fn series_to_values( span, Span::unknown(), )), + span, } } }; @@ -897,6 +898,7 @@ fn series_to_values( span, Span::unknown(), )), + span, } } }; @@ -950,6 +952,7 @@ fn series_to_values( span, Span::unknown(), )), + span, } } }; @@ -965,6 +968,7 @@ fn series_to_values( span, Span::unknown(), )), + span, } } }; diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/mod.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/mod.rs index 286e6e7fe..4e64015e0 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/mod.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_dataframe/mod.rs @@ -235,7 +235,7 @@ impl NuDataFrame { if Self::can_downcast(&value) { Ok(Self::get_df(value)?) } else if NuLazyFrame::can_downcast(&value) { - let span = value.span()?; + let span = value.span(); let lazy = NuLazyFrame::try_from_value(value)?; let df = lazy.collect(span)?; Ok(df) @@ -243,7 +243,7 @@ impl NuDataFrame { Err(ShellError::CantConvert { to_type: "lazy or eager dataframe".into(), from_type: value.get_type().to_string(), - span: value.span()?, + span: value.span(), help: None, }) } @@ -266,7 +266,7 @@ impl NuDataFrame { x => Err(ShellError::CantConvert { to_type: "dataframe".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/custom_value.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/custom_value.rs index 3eeb21478..85a0fb965 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/custom_value.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/custom_value.rs @@ -70,17 +70,17 @@ fn compute_with_value( match rhs.as_ref() { polars::prelude::Expr::Literal(..) => { - with_operator(operator, left, rhs, lhs_span, right.span()?, op) + with_operator(operator, left, rhs, lhs_span, right.span(), op) } _ => Err(ShellError::TypeMismatch { err_message: "Only literal expressions or number".into(), - span: right.span()?, + span: right.span(), }), } } _ => { let rhs = NuExpression::try_from_value(right.clone())?; - with_operator(operator, left, &rhs, lhs_span, right.span()?, op) + with_operator(operator, left, &rhs, lhs_span, right.span(), op) } } } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/mod.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/mod.rs index da01ca72d..2b51186b8 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/mod.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_expression/mod.rs @@ -79,7 +79,7 @@ impl NuExpression { x => Err(ShellError::CantConvert { to_type: "lazy expression".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } @@ -157,7 +157,7 @@ impl ExtractedExpr { x => Err(ShellError::CantConvert { to_type: "expression".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazyframe/mod.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazyframe/mod.rs index ff637bb60..60aac358f 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazyframe/mod.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazyframe/mod.rs @@ -135,7 +135,7 @@ impl NuLazyFrame { Err(ShellError::CantConvert { to_type: "lazy or eager dataframe".into(), from_type: value.get_type().to_string(), - span: value.span()?, + span: value.span(), help: None, }) } @@ -164,7 +164,7 @@ impl NuLazyFrame { x => Err(ShellError::CantConvert { to_type: "lazy frame".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazygroupby/mod.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazygroupby/mod.rs index 9d2efd15a..103319f5e 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazygroupby/mod.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_lazygroupby/mod.rs @@ -104,7 +104,7 @@ impl NuLazyGroupBy { x => Err(ShellError::CantConvert { to_type: "lazy groupby".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/nu_when/mod.rs b/crates/nu-cmd-dataframe/src/dataframe/values/nu_when/mod.rs index a1fe747e5..087309b6b 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/nu_when/mod.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/nu_when/mod.rs @@ -71,7 +71,7 @@ impl NuWhen { x => Err(ShellError::CantConvert { to_type: "when expression".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu-cmd-dataframe/src/dataframe/values/utils.rs b/crates/nu-cmd-dataframe/src/dataframe/values/utils.rs index 912adb237..5460ee659 100644 --- a/crates/nu-cmd-dataframe/src/dataframe/values/utils.rs +++ b/crates/nu-cmd-dataframe/src/dataframe/values/utils.rs @@ -21,7 +21,7 @@ pub(crate) fn convert_columns( Vec::new(), ) }) - .and_then(|v| v.span())?; + .map(|v| v.span())?; let res = columns .into_iter() @@ -61,7 +61,7 @@ pub(crate) fn convert_columns_string( Vec::new(), ) }) - .and_then(|v| v.span())?; + .map(|v| v.span())?; let res = columns .into_iter() diff --git a/crates/nu-cmd-extra/src/extra/bits/and.rs b/crates/nu-cmd-extra/src/extra/bits/and.rs index 5a3e245bd..fa6788763 100644 --- a/crates/nu-cmd-extra/src/extra/bits/and.rs +++ b/crates/nu-cmd-extra/src/extra/bits/and.rs @@ -90,8 +90,9 @@ fn operate(value: Value, target: i64, head: Span) -> Value { exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/into.rs b/crates/nu-cmd-extra/src/extra/bits/into.rs index 9db831261..86176fb17 100644 --- a/crates/nu-cmd-extra/src/extra/bits/into.rs +++ b/crates/nu-cmd-extra/src/extra/bits/into.rs @@ -256,8 +256,9 @@ pub fn action(input: &Value, _args: &Arguments, span: Span) -> Value { exp_input_type: "integer, filesize, string, date, duration, binary or bool".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/not.rs b/crates/nu-cmd-extra/src/extra/bits/not.rs index 4d21a2698..e932208c3 100644 --- a/crates/nu-cmd-extra/src/extra/bits/not.rs +++ b/crates/nu-cmd-extra/src/extra/bits/not.rs @@ -160,8 +160,9 @@ fn operate(value: Value, head: Span, signed: bool, number_size: NumberBytes) -> exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, }, } diff --git a/crates/nu-cmd-extra/src/extra/bits/or.rs b/crates/nu-cmd-extra/src/extra/bits/or.rs index 037d9cd78..cbf0585f1 100644 --- a/crates/nu-cmd-extra/src/extra/bits/or.rs +++ b/crates/nu-cmd-extra/src/extra/bits/or.rs @@ -90,8 +90,9 @@ fn operate(value: Value, target: i64, head: Span) -> Value { exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/rotate_left.rs b/crates/nu-cmd-extra/src/extra/bits/rotate_left.rs index 6e9fe7480..89288a39b 100644 --- a/crates/nu-cmd-extra/src/extra/bits/rotate_left.rs +++ b/crates/nu-cmd-extra/src/extra/bits/rotate_left.rs @@ -117,6 +117,7 @@ where None, Vec::new(), )), + span, }, } } @@ -146,8 +147,9 @@ fn operate(value: Value, bits: usize, head: Span, signed: bool, number_size: Num exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/rotate_right.rs b/crates/nu-cmd-extra/src/extra/bits/rotate_right.rs index f7edded5f..70e3a3ade 100644 --- a/crates/nu-cmd-extra/src/extra/bits/rotate_right.rs +++ b/crates/nu-cmd-extra/src/extra/bits/rotate_right.rs @@ -121,6 +121,7 @@ where None, Vec::new(), )), + span, }, } } @@ -150,8 +151,9 @@ fn operate(value: Value, bits: usize, head: Span, signed: bool, number_size: Num exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/shift_left.rs b/crates/nu-cmd-extra/src/extra/bits/shift_left.rs index 983513f5d..beff36cd3 100644 --- a/crates/nu-cmd-extra/src/extra/bits/shift_left.rs +++ b/crates/nu-cmd-extra/src/extra/bits/shift_left.rs @@ -129,6 +129,7 @@ where None, Vec::new(), )), + span, }, } } @@ -140,6 +141,7 @@ where None, Vec::new(), )), + span, }, } } @@ -169,8 +171,9 @@ fn operate(value: Value, bits: usize, head: Span, signed: bool, number_size: Num exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/shift_right.rs b/crates/nu-cmd-extra/src/extra/bits/shift_right.rs index dcb0a563e..e8af586e7 100644 --- a/crates/nu-cmd-extra/src/extra/bits/shift_right.rs +++ b/crates/nu-cmd-extra/src/extra/bits/shift_right.rs @@ -119,6 +119,7 @@ where None, Vec::new(), )), + span, }, } } @@ -130,6 +131,7 @@ where None, Vec::new(), )), + span, }, } } @@ -159,8 +161,9 @@ fn operate(value: Value, bits: usize, head: Span, signed: bool, number_size: Num exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/bits/xor.rs b/crates/nu-cmd-extra/src/extra/bits/xor.rs index 7819af433..73805c447 100644 --- a/crates/nu-cmd-extra/src/extra/bits/xor.rs +++ b/crates/nu-cmd-extra/src/extra/bits/xor.rs @@ -89,8 +89,9 @@ fn operate(value: Value, target: i64, head: Span) -> Value { exp_input_type: "integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/conversions/fmt.rs b/crates/nu-cmd-extra/src/extra/conversions/fmt.rs index ae8531ffc..d90aadb9d 100644 --- a/crates/nu-cmd-extra/src/extra/conversions/fmt.rs +++ b/crates/nu-cmd-extra/src/extra/conversions/fmt.rs @@ -91,8 +91,9 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { exp_input_type: "float , integer or filesize".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-cmd-extra/src/extra/filters/roll/mod.rs b/crates/nu-cmd-extra/src/extra/filters/roll/mod.rs index 46fe8d893..4ae803e7c 100644 --- a/crates/nu-cmd-extra/src/extra/filters/roll/mod.rs +++ b/crates/nu-cmd-extra/src/extra/filters/roll/mod.rs @@ -38,7 +38,7 @@ fn vertical_rotate_value( } _ => Err(ShellError::TypeMismatch { err_message: "list".to_string(), - span: value.span()?, + span: value.span(), }), } } @@ -85,7 +85,7 @@ fn horizontal_rotate_value( } _ => Err(ShellError::TypeMismatch { err_message: "record".to_string(), - span: value.span()?, + span: value.span(), }), } } diff --git a/crates/nu-cmd-extra/src/extra/filters/update_cells.rs b/crates/nu-cmd-extra/src/extra/filters/update_cells.rs index 305260760..458261b21 100644 --- a/crates/nu-cmd-extra/src/extra/filters/update_cells.rs +++ b/crates/nu-cmd-extra/src/extra/filters/update_cells.rs @@ -251,7 +251,10 @@ fn process_cell( redirect_stderr, ) { Ok(pd) => pd.into_value(span), - Err(e) => Value::Error { error: Box::new(e) }, + Err(e) => Value::Error { + error: Box::new(e), + span, + }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arccos.rs b/crates/nu-cmd-extra/src/extra/math/arccos.rs index 3798cea75..17e9cc35b 100644 --- a/crates/nu-cmd-extra/src/extra/math/arccos.rs +++ b/crates/nu-cmd-extra/src/extra/math/arccos.rs @@ -89,6 +89,7 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { head, span, )), + span, } } } @@ -98,8 +99,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arccosh.rs b/crates/nu-cmd-extra/src/extra/math/arccosh.rs index 70acfcb6a..19cb08cf9 100644 --- a/crates/nu-cmd-extra/src/extra/math/arccosh.rs +++ b/crates/nu-cmd-extra/src/extra/math/arccosh.rs @@ -79,6 +79,7 @@ fn operate(value: Value, head: Span) -> Value { head, span, )), + span, } } } @@ -88,8 +89,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arcsin.rs b/crates/nu-cmd-extra/src/extra/math/arcsin.rs index 774a4e76b..8253e509c 100644 --- a/crates/nu-cmd-extra/src/extra/math/arcsin.rs +++ b/crates/nu-cmd-extra/src/extra/math/arcsin.rs @@ -90,6 +90,7 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { head, span, )), + span, } } } @@ -99,8 +100,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arcsinh.rs b/crates/nu-cmd-extra/src/extra/math/arcsinh.rs index 72665a4cf..7e627c0c2 100644 --- a/crates/nu-cmd-extra/src/extra/math/arcsinh.rs +++ b/crates/nu-cmd-extra/src/extra/math/arcsinh.rs @@ -77,8 +77,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arctan.rs b/crates/nu-cmd-extra/src/extra/math/arctan.rs index 40d7f8927..955764885 100644 --- a/crates/nu-cmd-extra/src/extra/math/arctan.rs +++ b/crates/nu-cmd-extra/src/extra/math/arctan.rs @@ -88,8 +88,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/arctanh.rs b/crates/nu-cmd-extra/src/extra/math/arctanh.rs index 9082cd051..dc0984b19 100644 --- a/crates/nu-cmd-extra/src/extra/math/arctanh.rs +++ b/crates/nu-cmd-extra/src/extra/math/arctanh.rs @@ -79,6 +79,7 @@ fn operate(value: Value, head: Span) -> Value { head, span, )), + span: head, } } } @@ -88,8 +89,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/cos.rs b/crates/nu-cmd-extra/src/extra/math/cos.rs index a7d899e47..a211a834d 100644 --- a/crates/nu-cmd-extra/src/extra/math/cos.rs +++ b/crates/nu-cmd-extra/src/extra/math/cos.rs @@ -97,8 +97,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/cosh.rs b/crates/nu-cmd-extra/src/extra/math/cosh.rs index dcfd854e4..1d7f2fd2d 100644 --- a/crates/nu-cmd-extra/src/extra/math/cosh.rs +++ b/crates/nu-cmd-extra/src/extra/math/cosh.rs @@ -79,8 +79,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/exp.rs b/crates/nu-cmd-extra/src/extra/math/exp.rs index 5b7aa0cb3..faa586226 100644 --- a/crates/nu-cmd-extra/src/extra/math/exp.rs +++ b/crates/nu-cmd-extra/src/extra/math/exp.rs @@ -85,8 +85,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/ln.rs b/crates/nu-cmd-extra/src/extra/math/ln.rs index b6ce3ba30..3880cf09c 100644 --- a/crates/nu-cmd-extra/src/extra/math/ln.rs +++ b/crates/nu-cmd-extra/src/extra/math/ln.rs @@ -79,6 +79,7 @@ fn operate(value: Value, head: Span) -> Value { head, span, )), + span, } } } @@ -88,8 +89,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/sin.rs b/crates/nu-cmd-extra/src/extra/math/sin.rs index 95b799493..d4f1a4d78 100644 --- a/crates/nu-cmd-extra/src/extra/math/sin.rs +++ b/crates/nu-cmd-extra/src/extra/math/sin.rs @@ -97,8 +97,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/sinh.rs b/crates/nu-cmd-extra/src/extra/math/sinh.rs index 490ac3910..acfaebc25 100644 --- a/crates/nu-cmd-extra/src/extra/math/sinh.rs +++ b/crates/nu-cmd-extra/src/extra/math/sinh.rs @@ -79,8 +79,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/tan.rs b/crates/nu-cmd-extra/src/extra/math/tan.rs index 7470ef3a7..0d8b87f89 100644 --- a/crates/nu-cmd-extra/src/extra/math/tan.rs +++ b/crates/nu-cmd-extra/src/extra/math/tan.rs @@ -95,8 +95,9 @@ fn operate(value: Value, head: Span, use_degrees: bool) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/math/tanh.rs b/crates/nu-cmd-extra/src/extra/math/tanh.rs index 0dbf6413f..15331762a 100644 --- a/crates/nu-cmd-extra/src/extra/math/tanh.rs +++ b/crates/nu-cmd-extra/src/extra/math/tanh.rs @@ -78,8 +78,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-extra/src/extra/platform/ansi/gradient.rs b/crates/nu-cmd-extra/src/extra/platform/ansi/gradient.rs index 40de006e2..3237222af 100644 --- a/crates/nu-cmd-extra/src/extra/platform/ansi/gradient.rs +++ b/crates/nu-cmd-extra/src/extra/platform/ansi/gradient.rs @@ -140,6 +140,7 @@ fn operate( if let Err(error) = r { return Value::Error { error: Box::new(error), + span: head, }; } } @@ -170,6 +171,7 @@ fn action( "please supply foreground and/or background color parameters".into(), span: command_span, }), + span: command_span, } } (None, None, None, Some(bg_end)) => { @@ -295,8 +297,9 @@ fn action( Value::Error { error: Box::new(ShellError::TypeMismatch { err_message: got, - span: other.span().unwrap_or(command_span), + span: other.span(), }), + span: other.span(), } } } diff --git a/crates/nu-cmd-extra/src/extra/platform/ansi/link.rs b/crates/nu-cmd-extra/src/extra/platform/ansi/link.rs index 1d143dae1..136740524 100644 --- a/crates/nu-cmd-extra/src/extra/platform/ansi/link.rs +++ b/crates/nu-cmd-extra/src/extra/platform/ansi/link.rs @@ -98,7 +98,7 @@ fn operate( if column_paths.is_empty() { input.map( - move |v| process_value(&v, &text, command_span), + move |v| process_value(&v, &text), engine_state.ctrlc.clone(), ) } else { @@ -116,20 +116,18 @@ fn process_each_path( command_span: Span, ) -> Value { for path in column_paths { - let ret = value.update_cell_path( - &path.members, - Box::new(|v| process_value(v, text, command_span)), - ); + let ret = value.update_cell_path(&path.members, Box::new(|v| process_value(v, text))); if let Err(error) = ret { return Value::Error { error: Box::new(error), + span: command_span, }; } } value } -fn process_value(value: &Value, text: &Option, command_span: Span) -> Value { +fn process_value(value: &Value, text: &Option) -> Value { match value { Value::String { val, span } => { let text = text.as_deref().unwrap_or(val.as_str()); @@ -142,8 +140,9 @@ fn process_value(value: &Value, text: &Option, command_span: Span) -> Va Value::Error { error: Box::new(ShellError::TypeMismatch { err_message: got, - span: other.span().unwrap_or(command_span), + span: other.span(), }), + span: other.span(), } } } diff --git a/crates/nu-cmd-extra/src/extra/strings/encode_decode/hex.rs b/crates/nu-cmd-extra/src/extra/strings/encode_decode/hex.rs index 3485dd95a..826e40c07 100644 --- a/crates/nu-cmd-extra/src/extra/strings/encode_decode/hex.rs +++ b/crates/nu-cmd-extra/src/extra/strings/encode_decode/hex.rs @@ -113,8 +113,9 @@ fn action( "value originates from here".into(), command_span, // This line requires the Value::Error {} match above. - input.expect_span(), + input.span(), )), + span: command_span, }, }, Value::String { val, .. } => { @@ -125,8 +126,9 @@ fn action( "value originates from here".into(), command_span, // This line requires the Value::Error {} match above. - input.expect_span(), + input.span(), )), + span: command_span, }, ActionType::Decode => match hex_decode(val.as_ref()) { @@ -139,6 +141,7 @@ fn action( None, Vec::new(), )), + span: command_span, }, Err(HexDecodingError::InvalidDigit(index, digit)) => Value::Error { error: Box::new(ShellError::GenericError( @@ -148,6 +151,7 @@ fn action( None, Vec::new(), )), + span: command_span, }, }, } @@ -155,8 +159,9 @@ fn action( other => Value::Error { error: Box::new(ShellError::TypeMismatch { err_message: format!("string or binary, not {}", other.get_type()), - span: other.span().unwrap_or(command_span), + span: other.span(), }), + span: other.span(), }, } } diff --git a/crates/nu-cmd-extra/src/extra/strings/format/command.rs b/crates/nu-cmd-extra/src/extra/strings/format/command.rs index d5a50e5a6..13497a2a6 100644 --- a/crates/nu-cmd-extra/src/extra/strings/format/command.rs +++ b/crates/nu-cmd-extra/src/extra/strings/format/command.rs @@ -55,7 +55,7 @@ impl Command for Format { Err(e) => Err(e), Ok(pattern) => { let string_pattern = pattern.as_string()?; - let string_span = pattern.span()?; + let string_span = pattern.span(); // the string span is start as `"`, we don't need the character // to generate proper span for sub expression. let ops = extract_formatting_operations( @@ -233,13 +233,13 @@ fn format( } } } - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), _ => { return Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record".to_string(), wrong_type: val.get_type().to_string(), dst_span: head_span, - src_span: val.expect_span(), + src_span: val.span(), }) } } @@ -252,12 +252,12 @@ fn format( } // Unwrapping this ShellError is a bit unfortunate. // Ideally, its Span would be preserved. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), _ => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record".to_string(), wrong_type: data_as_value.get_type().to_string(), dst_span: head_span, - src_span: data_as_value.expect_span(), + src_span: data_as_value.span(), }), } } diff --git a/crates/nu-cmd-extra/src/extra/strings/str_/case/mod.rs b/crates/nu-cmd-extra/src/extra/strings/str_/case/mod.rs index dac550c4d..4923795ac 100644 --- a/crates/nu-cmd-extra/src/extra/strings/str_/case/mod.rs +++ b/crates/nu-cmd-extra/src/extra/strings/str_/case/mod.rs @@ -67,8 +67,9 @@ where exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-cmd-lang/src/core_commands/do_.rs b/crates/nu-cmd-lang/src/core_commands/do_.rs index 65ed6a4f7..48c0751f8 100644 --- a/crates/nu-cmd-lang/src/core_commands/do_.rs +++ b/crates/nu-cmd-lang/src/core_commands/do_.rs @@ -91,7 +91,7 @@ impl Command for Do { } let span = if let Some(rest_item) = rest_items.first() { - rest_item.span()? + rest_item.span() } else { call.head }; diff --git a/crates/nu-cmd-lang/src/core_commands/error_make.rs b/crates/nu-cmd-lang/src/core_commands/error_make.rs index 0ad64a42f..3682ccb57 100644 --- a/crates/nu-cmd-lang/src/core_commands/error_make.rs +++ b/crates/nu-cmd-lang/src/core_commands/error_make.rs @@ -73,6 +73,7 @@ impl Command for ErrorMake { None, Vec::new(), )), + span: Span::unknown(), }), }, Example { @@ -93,6 +94,7 @@ impl Command for ErrorMake { None, Vec::new(), )), + span: Span::unknown(), }), }, Example { @@ -126,10 +128,7 @@ fn make_error(value: &Value, throw_span: Option) -> Option { let label_end = label.get_data_by_key("end"); let label_text = label.get_data_by_key("text"); - let label_span = match label.span() { - Ok(lspan) => Some(lspan), - Err(_) => None, - }; + let label_span = Some(label.span()); match (label_start, label_end, label_text) { ( diff --git a/crates/nu-cmd-lang/src/core_commands/if_.rs b/crates/nu-cmd-lang/src/core_commands/if_.rs index 129db3b37..43c97bbe7 100644 --- a/crates/nu-cmd-lang/src/core_commands/if_.rs +++ b/crates/nu-cmd-lang/src/core_commands/if_.rs @@ -105,7 +105,7 @@ impl Command for If { x => Err(ShellError::CantConvert { to_type: "bool".into(), from_type: x.get_type().to_string(), - span: result.span()?, + span: result.span(), help: None, }), } diff --git a/crates/nu-cmd-lang/src/core_commands/try_.rs b/crates/nu-cmd-lang/src/core_commands/try_.rs index 6d7da363d..eda117200 100644 --- a/crates/nu-cmd-lang/src/core_commands/try_.rs +++ b/crates/nu-cmd-lang/src/core_commands/try_.rs @@ -56,7 +56,7 @@ impl Command for Try { let err_record = err_to_record(error, call.head); handle_catch(err_record, catch_block, engine_state, stack) } - Ok(PipelineData::Value(Value::Error { error }, ..)) => { + Ok(PipelineData::Value(Value::Error { error, .. }, ..)) => { let error = intercept_block_control(*error)?; let err_record = err_to_record(error, call.head); handle_catch(err_record, catch_block, engine_state, stack) @@ -141,7 +141,7 @@ fn err_to_record(error: ShellError, head: Span) -> Value { record! { "msg" => Value::string(error.to_string(), head), "debug" => Value::string(format!("{error:?}"), head), - "raw" => Value::error(error), + "raw" => Value::error(error, head), }, head, ) diff --git a/crates/nu-cmd-lang/src/core_commands/while_.rs b/crates/nu-cmd-lang/src/core_commands/while_.rs index e375f0d0a..4a6f842ff 100644 --- a/crates/nu-cmd-lang/src/core_commands/while_.rs +++ b/crates/nu-cmd-lang/src/core_commands/while_.rs @@ -86,7 +86,7 @@ impl Command for While { return Err(ShellError::CantConvert { to_type: "bool".into(), from_type: x.get_type().to_string(), - span: result.span()?, + span: result.span(), help: None, }) } diff --git a/crates/nu-command/src/bytes/add.rs b/crates/nu-command/src/bytes/add.rs index a3aba9691..2bbb07f4a 100644 --- a/crates/nu-command/src/bytes/add.rs +++ b/crates/nu-command/src/bytes/add.rs @@ -137,8 +137,9 @@ fn add(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/at.rs b/crates/nu-command/src/bytes/at.rs index f1b6b01f9..db024f814 100644 --- a/crates/nu-command/src/bytes/at.rs +++ b/crates/nu-command/src/bytes/at.rs @@ -178,6 +178,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { err_message: "End must be greater than or equal to Start".to_string(), span: head, }), + span: head, }, Ordering::Less => Value::Binary { val: { @@ -210,8 +211,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { format!("input type: {:?}", other.get_type()), head, // This line requires the Value::Error match above. - other.expect_span(), + other.span(), )), + span: head, }, } } diff --git a/crates/nu-command/src/bytes/build_.rs b/crates/nu-command/src/bytes/build_.rs index 0b80a4895..4726ee155 100644 --- a/crates/nu-command/src/bytes/build_.rs +++ b/crates/nu-command/src/bytes/build_.rs @@ -53,11 +53,11 @@ impl Command for BytesBuild { match val { Value::Binary { mut val, .. } => output.append(&mut val), // Explicitly propagate errors instead of dropping them. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), other => { return Err(ShellError::TypeMismatch { err_message: "only binary data arguments are supported".to_string(), - span: other.expect_span(), + span: other.span(), }) } } diff --git a/crates/nu-command/src/bytes/collect.rs b/crates/nu-command/src/bytes/collect.rs index d68c915b1..96bfa8328 100644 --- a/crates/nu-command/src/bytes/collect.rs +++ b/crates/nu-command/src/bytes/collect.rs @@ -55,13 +55,13 @@ impl Command for BytesCollect { } } // Explicitly propagate errors instead of dropping them. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), other => { return Err(ShellError::OnlySupportsThisInputType { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: call.head, - src_span: other.expect_span(), + src_span: other.span(), }); } } diff --git a/crates/nu-command/src/bytes/ends_with.rs b/crates/nu-command/src/bytes/ends_with.rs index 0a12cbbae..1c18b2558 100644 --- a/crates/nu-command/src/bytes/ends_with.rs +++ b/crates/nu-command/src/bytes/ends_with.rs @@ -101,8 +101,9 @@ fn ends_with(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/index_of.rs b/crates/nu-command/src/bytes/index_of.rs index bcb02861b..6a5ac0fdc 100644 --- a/crates/nu-command/src/bytes/index_of.rs +++ b/crates/nu-command/src/bytes/index_of.rs @@ -143,8 +143,9 @@ fn index_of(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/length.rs b/crates/nu-command/src/bytes/length.rs index bfca8fd6d..115354788 100644 --- a/crates/nu-command/src/bytes/length.rs +++ b/crates/nu-command/src/bytes/length.rs @@ -86,8 +86,9 @@ fn length(val: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/remove.rs b/crates/nu-command/src/bytes/remove.rs index bc43760be..a0dd3a04e 100644 --- a/crates/nu-command/src/bytes/remove.rs +++ b/crates/nu-command/src/bytes/remove.rs @@ -149,8 +149,9 @@ fn remove(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/replace.rs b/crates/nu-command/src/bytes/replace.rs index a78fcae73..5fdc61314 100644 --- a/crates/nu-command/src/bytes/replace.rs +++ b/crates/nu-command/src/bytes/replace.rs @@ -141,8 +141,9 @@ fn replace(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/reverse.rs b/crates/nu-command/src/bytes/reverse.rs index 437d0fb46..97488f937 100644 --- a/crates/nu-command/src/bytes/reverse.rs +++ b/crates/nu-command/src/bytes/reverse.rs @@ -93,8 +93,9 @@ fn reverse(val: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/bytes/starts_with.rs b/crates/nu-command/src/bytes/starts_with.rs index dc1d6acc1..e1d7c8a52 100644 --- a/crates/nu-command/src/bytes/starts_with.rs +++ b/crates/nu-command/src/bytes/starts_with.rs @@ -89,8 +89,9 @@ impl Command for BytesStartsWith { exp_input_type: "string and binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, } .into_pipeline_data()); } @@ -158,8 +159,9 @@ fn starts_with(val: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/charting/hashable_value.rs b/crates/nu-command/src/charting/hashable_value.rs index 61ec9d82c..49074e122 100644 --- a/crates/nu-command/src/charting/hashable_value.rs +++ b/crates/nu-command/src/charting/hashable_value.rs @@ -79,12 +79,12 @@ impl HashableValue { Value::Binary { val, span } => Ok(HashableValue::Binary { val, span }), // Explicitly propagate errors instead of dropping them. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), _ => Err(ShellError::UnsupportedInput( "input value is not hashable".into(), format!("input type: {:?}", value.get_type()), span, - value.expect_span(), + value.span(), )), } } @@ -237,6 +237,7 @@ mod test { Value::Nothing { span }, Value::Error { error: Box::new(ShellError::DidYouMean("what?".to_string(), span)), + span, }, Value::CellPath { val: CellPath { diff --git a/crates/nu-command/src/charting/histogram.rs b/crates/nu-command/src/charting/histogram.rs index 35c1864ae..5bbb4413e 100755 --- a/crates/nu-command/src/charting/histogram.rs +++ b/crates/nu-command/src/charting/histogram.rs @@ -142,7 +142,7 @@ impl Command for Histogram { calc_method, span, // Note that as_list() filters out Value::Error here. - data_as_value.expect_span(), + data_as_value.span(), ) } } @@ -164,10 +164,10 @@ fn run_histogram( for v in values { match v { // Propagate existing errors. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), _ => { let t = v.get_type(); - let span = v.expect_span(); + let span = v.span(); inputs.push(HashableValue::from_value(v, head_span).map_err(|_| { ShellError::UnsupportedInput( "Since --column-name was not provided, only lists of hashable values are supported.".to_string(), @@ -202,7 +202,7 @@ fn run_histogram( } } // Propagate existing errors. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), _ => continue, } } diff --git a/crates/nu-command/src/conversions/fill.rs b/crates/nu-command/src/conversions/fill.rs index 94205ebb6..01697e6ea 100644 --- a/crates/nu-command/src/conversions/fill.rs +++ b/crates/nu-command/src/conversions/fill.rs @@ -203,8 +203,9 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { exp_input_type: "int, filesize, float, string".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/conversions/into/binary.rs b/crates/nu-command/src/conversions/into/binary.rs index b8baa0df8..f2b6e632d 100644 --- a/crates/nu-command/src/conversions/into/binary.rs +++ b/crates/nu-command/src/conversions/into/binary.rs @@ -204,8 +204,9 @@ pub fn action(input: &Value, _args: &Arguments, span: Span) -> Value { .into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, }; diff --git a/crates/nu-command/src/conversions/into/bool.rs b/crates/nu-command/src/conversions/into/bool.rs index d86780ea4..c5b81e4ed 100644 --- a/crates/nu-command/src/conversions/into/bool.rs +++ b/crates/nu-command/src/conversions/into/bool.rs @@ -161,6 +161,7 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { Ok(val) => Value::Bool { val, span }, Err(error) => Value::Error { error: Box::new(error), + span, }, }, // Propagate errors by explicitly matching them before the final case. @@ -170,8 +171,9 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { exp_input_type: "bool, integer, float or string".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } diff --git a/crates/nu-command/src/conversions/into/datetime.rs b/crates/nu-command/src/conversions/into/datetime.rs index 8fce51f56..b03bfe4a2 100644 --- a/crates/nu-command/src/conversions/into/datetime.rs +++ b/crates/nu-command/src/conversions/into/datetime.rs @@ -264,8 +264,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { exp_input_type: "string and integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }; } }; @@ -308,6 +309,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { input.debug_value(), *span, )), + span: *span, }, }, Zone::West(i) => match FixedOffset::west_opt((*i as i32) * HOUR) { @@ -323,6 +325,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { input.debug_value(), *span, )), + span: *span, }, }, Zone::Error => Value::Error { @@ -331,6 +334,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { err_message: "Invalid timezone or offset".to_string(), span: *span, }), + span: *span, }, }, }; @@ -346,6 +350,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { Err(reason) => { Value::Error { error: Box::new(ShellError::CantConvert { to_type: format!("could not parse as datetime using format '{}'", dt.0), from_type: reason.to_string(), span: head, help: Some("you can use `into datetime` without a format string to enable flexible parsing".to_string()) }), + span: head, } } }, @@ -369,8 +374,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/conversions/into/decimal.rs b/crates/nu-command/src/conversions/into/decimal.rs index a9b0d982d..906669d6c 100644 --- a/crates/nu-command/src/conversions/into/decimal.rs +++ b/crates/nu-command/src/conversions/into/decimal.rs @@ -107,6 +107,7 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, head: Span) -> Value { span: *span, help: None, }), + span: *span, }, } } @@ -125,8 +126,9 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, head: Span) -> Value { exp_input_type: "string, integer or bool".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/conversions/into/duration.rs b/crates/nu-command/src/conversions/into/duration.rs index 24fc06900..667e9d02e 100644 --- a/crates/nu-command/src/conversions/into/duration.rs +++ b/crates/nu-command/src/conversions/into/duration.rs @@ -156,6 +156,7 @@ fn into_duration( if let Err(error) = r { return Value::Error { error: Box::new(error), + span, }; } } @@ -235,6 +236,7 @@ fn action(input: &Value, span: Span) -> Value { Ok(val) => Value::Duration { val, span }, Err(error) => Value::Error { error: Box::new(error), + span, }, }, // Propagate errors by explicitly matching them before the final case. @@ -244,8 +246,9 @@ fn action(input: &Value, span: Span) -> Value { exp_input_type: "string or duration".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } @@ -270,7 +273,7 @@ mod test { #[case("4\u{00B5}s", 4*1000)] // micro sign #[case("4\u{03BC}s", 4*1000)] // mu symbol #[case("5ms", 5 * 1000 * 1000)] - #[case("1sec", 1 * NS_PER_SEC)] + #[case("1sec", NS_PER_SEC)] #[case("7min", 7 * 60 * NS_PER_SEC)] #[case("42hr", 42 * 60 * 60 * NS_PER_SEC)] #[case("123day", 123 * 24 * 60 * 60 * NS_PER_SEC)] diff --git a/crates/nu-command/src/conversions/into/filesize.rs b/crates/nu-command/src/conversions/into/filesize.rs index 38303f0de..6b852c914 100644 --- a/crates/nu-command/src/conversions/into/filesize.rs +++ b/crates/nu-command/src/conversions/into/filesize.rs @@ -148,42 +148,40 @@ impl Command for SubCommand { } pub fn action(input: &Value, _args: &CellPathOnlyArgs, span: Span) -> Value { - if let Ok(value_span) = input.span() { - match input { - Value::Filesize { .. } => input.clone(), - Value::Int { val, .. } => Value::Filesize { - val: *val, + let value_span = input.span(); + match input { + Value::Filesize { .. } => input.clone(), + Value::Int { val, .. } => Value::Filesize { + val: *val, + span: value_span, + }, + Value::Float { val, .. } => Value::Filesize { + val: *val as i64, + span: value_span, + }, + Value::String { val, .. } => match int_from_string(val, value_span) { + Ok(val) => Value::Filesize { + val, span: value_span, }, - Value::Float { val, .. } => Value::Filesize { - val: *val as i64, + Err(error) => Value::Error { + error: Box::new(error), span: value_span, }, - Value::String { val, .. } => match int_from_string(val, value_span) { - Ok(val) => Value::Filesize { - val, - span: value_span, - }, - Err(error) => Value::Error { - error: Box::new(error), - }, - }, - Value::Nothing { .. } => Value::Filesize { - val: 0, - span: value_span, - }, - other => Value::Error { - error: Box::new(ShellError::OnlySupportsThisInputType { - exp_input_type: "string and integer".into(), - wrong_type: other.get_type().to_string(), - dst_span: span, - src_span: value_span, - }), - }, - } - } else { - // Propagate existing errors - input.clone() + }, + Value::Nothing { .. } => Value::Filesize { + val: 0, + span: value_span, + }, + other => Value::Error { + error: Box::new(ShellError::OnlySupportsThisInputType { + exp_input_type: "string and integer".into(), + wrong_type: other.get_type().to_string(), + dst_span: span, + src_span: value_span, + }), + span, + }, } } fn int_from_string(a_string: &str, span: Span) -> Result { diff --git a/crates/nu-command/src/conversions/into/int.rs b/crates/nu-command/src/conversions/into/int.rs index 23bc33bb9..7a6dfb846 100644 --- a/crates/nu-command/src/conversions/into/int.rs +++ b/crates/nu-command/src/conversions/into/int.rs @@ -250,6 +250,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { span, help: None, }), + span, } } } @@ -263,6 +264,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { Ok(val) => Value::Int { val, span }, Err(error) => Value::Error { error: Box::new(error), + span, }, } } else { @@ -297,6 +299,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { val_span: *val_span, call_span: span, }), + span, } } else { Value::Int { @@ -335,8 +338,9 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { .into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }, } } @@ -353,7 +357,12 @@ fn convert_int(input: &Value, head: Span, radix: u32) -> Value { { match int_from_string(val, head) { Ok(x) => return Value::int(x, head), - Err(e) => return Value::Error { error: Box::new(e) }, + Err(e) => { + return Value::Error { + error: Box::new(e), + span: head, + } + } } } else if val.starts_with("00") { // It's a padded string @@ -367,6 +376,7 @@ fn convert_int(input: &Value, head: Span, radix: u32) -> Value { span: head, help: Some(e.to_string()), }), + span: head, } } } @@ -381,8 +391,9 @@ fn convert_int(input: &Value, head: Span, radix: u32) -> Value { exp_input_type: "string and integer".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }; } }; @@ -395,6 +406,7 @@ fn convert_int(input: &Value, head: Span, radix: u32) -> Value { span: head, help: None, }), + span: head, }, } } @@ -583,7 +595,7 @@ mod test { }, Span::test_data(), ); - if let Value::Error { error } = actual { + if let Value::Error { error, .. } = actual { if let ShellError::IncorrectValue { msg: e, .. } = *error { assert!( e.contains(err_expected), diff --git a/crates/nu-command/src/conversions/into/record.rs b/crates/nu-command/src/conversions/into/record.rs index 20af63199..45ded57d9 100644 --- a/crates/nu-command/src/conversions/into/record.rs +++ b/crates/nu-command/src/conversions/into/record.rs @@ -176,8 +176,9 @@ fn into_record( exp_input_type: "string".into(), wrong_type: other.get_type().to_string(), dst_span: call.head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: call.head, }, }; Ok(res.into_pipeline_data()) diff --git a/crates/nu-command/src/conversions/into/string.rs b/crates/nu-command/src/conversions/into/string.rs index 634fbf2d8..f5d1a8801 100644 --- a/crates/nu-command/src/conversions/into/string.rs +++ b/crates/nu-command/src/conversions/into/string.rs @@ -249,7 +249,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { span, }, - Value::Error { error } => Value::String { + Value::Error { error, .. } => Value::String { val: into_code(error).unwrap_or_default(), span, }, @@ -265,6 +265,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { span, help: Some("try using the `to nuon` command".into()), }), + span, }, Value::Binary { .. } => Value::Error { error: Box::new(ShellError::CantConvert { @@ -273,6 +274,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { span, help: Some("try using the `decode` command".into()), }), + span, }, x => Value::Error { error: Box::new(ShellError::CantConvert { @@ -281,6 +283,7 @@ fn action(input: &Value, args: &Arguments, span: Span) -> Value { span, help: None, }), + span, }, } } diff --git a/crates/nu-command/src/database/commands/into_sqlite.rs b/crates/nu-command/src/database/commands/into_sqlite.rs index 782f34038..bffad8ed7 100644 --- a/crates/nu-command/src/database/commands/into_sqlite.rs +++ b/crates/nu-command/src/database/commands/into_sqlite.rs @@ -213,12 +213,12 @@ fn action( Ok(Value::Nothing { span: *span }) } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), } } @@ -261,7 +261,7 @@ fn nu_value_to_string(value: Value, separator: &str) -> String { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), diff --git a/crates/nu-command/src/database/values/sqlite.rs b/crates/nu-command/src/database/values/sqlite.rs index 99c51aa53..18e5be698 100644 --- a/crates/nu-command/src/database/values/sqlite.rs +++ b/crates/nu-command/src/database/values/sqlite.rs @@ -72,7 +72,7 @@ impl SQLiteDatabase { x => Err(ShellError::CantConvert { to_type: "database".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } @@ -459,6 +459,7 @@ pub fn convert_sqlite_value_to_nu_value(value: ValueRef, span: Span) -> Value { Err(_) => { return Value::Error { error: Box::new(ShellError::NonUtf8(span)), + span, } } }; diff --git a/crates/nu-command/src/date/humanize.rs b/crates/nu-command/src/date/humanize.rs index 7fbeb53e1..33ce986a0 100644 --- a/crates/nu-command/src/date/humanize.rs +++ b/crates/nu-command/src/date/humanize.rs @@ -91,6 +91,7 @@ fn helper(value: Value, head: Span) -> Value { }, _ => Value::Error { error: Box::new(ShellError::DatetimeParseError(value.debug_value(), head)), + span: head, }, } } diff --git a/crates/nu-command/src/date/to_record.rs b/crates/nu-command/src/date/to_record.rs index 396318d87..55d2c958b 100644 --- a/crates/nu-command/src/date/to_record.rs +++ b/crates/nu-command/src/date/to_record.rs @@ -166,6 +166,7 @@ fn helper(val: Value, head: Span) -> Value { Value::Date { val, span: _ } => parse_date_into_table(val, head), _ => Value::Error { error: Box::new(DatetimeParseError(val.debug_value(), head)), + span: head, }, } } diff --git a/crates/nu-command/src/date/to_table.rs b/crates/nu-command/src/date/to_table.rs index 697de40eb..aaf33f3fb 100644 --- a/crates/nu-command/src/date/to_table.rs +++ b/crates/nu-command/src/date/to_table.rs @@ -168,6 +168,7 @@ fn helper(val: Value, head: Span) -> Value { Value::Date { val, span: _ } => parse_date_into_table(val, head), _ => Value::Error { error: Box::new(DatetimeParseError(val.debug_value(), head)), + span: head, }, } } diff --git a/crates/nu-command/src/date/to_timezone.rs b/crates/nu-command/src/date/to_timezone.rs index 2e745b93c..9afcbad5a 100644 --- a/crates/nu-command/src/date/to_timezone.rs +++ b/crates/nu-command/src/date/to_timezone.rs @@ -128,6 +128,7 @@ fn helper(value: Value, head: Span, timezone: &Spanned) -> Value { } _ => Value::Error { error: Box::new(ShellError::DatetimeParseError(value.debug_value(), head)), + span: head, }, } } @@ -140,6 +141,7 @@ fn _to_timezone(dt: DateTime, timezone: &Spanned, span: Spa err_message: String::from("invalid time zone"), span: timezone.span, }), + span: timezone.span, }, } } diff --git a/crates/nu-command/src/date/utils.rs b/crates/nu-command/src/date/utils.rs index e90e34a3f..3df3fcc59 100644 --- a/crates/nu-command/src/date/utils.rs +++ b/crates/nu-command/src/date/utils.rs @@ -16,11 +16,13 @@ pub(crate) fn parse_date_from_string( LocalResult::Ambiguous(d, _) => Ok(d), LocalResult::None => Err(Value::Error { error: Box::new(ShellError::DatetimeParseError(input.to_string(), span)), + span, }), } } Err(_) => Err(Value::Error { error: Box::new(ShellError::DatetimeParseError(input.to_string(), span)), + span, }), } } diff --git a/crates/nu-command/src/debug/explain.rs b/crates/nu-command/src/debug/explain.rs index 32241d771..615c20f1a 100644 --- a/crates/nu-command/src/debug/explain.rs +++ b/crates/nu-command/src/debug/explain.rs @@ -86,7 +86,7 @@ pub fn get_pipeline_elements( }; let index = format!("{pipeline_idx}_{i}"); let value_type = value.get_type(); - let value_span = value.span()?; + let value_span = value.span(); let value_span_start = value_span.start as i64; let value_span_end = value_span.end as i64; let command_name = command_name; @@ -150,7 +150,7 @@ fn get_arguments(engine_state: &EngineState, stack: &mut Stack, call: Call) -> V let arg_type = "expr"; let arg_value_name = debug_string_without_formatting(&evaluated_expression); let arg_value_type = &evaluated_expression.get_type().to_string(); - let evaled_span = evaluated_expression.expect_span(); + let evaled_span = evaluated_expression.span(); let arg_value_name_span_start = evaled_span.start as i64; let arg_value_name_span_end = evaled_span.end as i64; @@ -169,7 +169,7 @@ fn get_arguments(engine_state: &EngineState, stack: &mut Stack, call: Call) -> V let evaluated_expression = get_expression_as_value(engine_state, stack, inner_expr); let arg_value_name = debug_string_without_formatting(&evaluated_expression); let arg_value_type = &evaluated_expression.get_type().to_string(); - let evaled_span = evaluated_expression.expect_span(); + let evaled_span = evaluated_expression.span(); let arg_value_name_span_start = evaled_span.start as i64; let arg_value_name_span_end = evaled_span.end as i64; @@ -187,7 +187,7 @@ fn get_arguments(engine_state: &EngineState, stack: &mut Stack, call: Call) -> V let evaluated_expression = get_expression_as_value(engine_state, stack, inner_expr); let arg_value_name = debug_string_without_formatting(&evaluated_expression); let arg_value_type = &evaluated_expression.get_type().to_string(); - let evaled_span = evaluated_expression.expect_span(); + let evaled_span = evaluated_expression.span(); let arg_value_name_span_start = evaled_span.start as i64; let arg_value_name_span_end = evaled_span.end as i64; @@ -215,6 +215,7 @@ fn get_expression_as_value( Ok(v) => v, Err(error) => Value::Error { error: Box::new(error), + span: inner_expr.span, }, } } @@ -257,7 +258,7 @@ pub fn debug_string_without_formatting(value: &Value) -> String { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), diff --git a/crates/nu-command/src/debug/metadata.rs b/crates/nu-command/src/debug/metadata.rs index 2f0dc2d61..08f813e57 100644 --- a/crates/nu-command/src/debug/metadata.rs +++ b/crates/nu-command/src/debug/metadata.rs @@ -116,18 +116,17 @@ fn build_metadata_record( ) -> Value { let mut record = Record::new(); - if let Ok(span) = arg.span() { - record.push( - "span", - Value::record( - record! { - "start" => Value::int(span.start as i64,span), - "end" => Value::int(span.end as i64, span), - }, - head, - ), - ); - } + let span = arg.span(); + record.push( + "span", + Value::record( + record! { + "start" => Value::int(span.start as i64,span), + "end" => Value::int(span.end as i64, span), + }, + head, + ), + ); if let Some(x) = metadata.as_deref() { match x { diff --git a/crates/nu-command/src/debug/view_source.rs b/crates/nu-command/src/debug/view_source.rs index d49683551..3d1af9c50 100644 --- a/crates/nu-command/src/debug/view_source.rs +++ b/crates/nu-command/src/debug/view_source.rs @@ -34,7 +34,7 @@ impl Command for ViewSource { _input: PipelineData, ) -> Result { let arg: Value = call.req(engine_state, stack, 0)?; - let arg_span = arg.span()?; + let arg_span = arg.span(); match arg { Value::Block { val: block_id, .. } | Value::Closure { val: block_id, .. } => { diff --git a/crates/nu-command/src/filesystem/cp.rs b/crates/nu-command/src/filesystem/cp.rs index 20c05474b..3fc52a95e 100644 --- a/crates/nu-command/src/filesystem/cp.rs +++ b/crates/nu-command/src/filesystem/cp.rs @@ -402,6 +402,7 @@ fn interactive_copy( None, Vec::new(), )), + span, } } else if !confirmed { let msg = format!("{:} not copied to {:}", src.display(), dst.display()); @@ -541,6 +542,7 @@ fn copy_symlink( None, vec![], )), + span, } } }; @@ -574,6 +576,7 @@ fn copy_symlink( None, vec![], )), + span, }, } } @@ -617,5 +620,6 @@ fn convert_io_error(error: std::io::Error, src: PathBuf, dst: PathBuf, span: Spa Value::Error { error: Box::new(shell_error), + span, } } diff --git a/crates/nu-command/src/filesystem/glob.rs b/crates/nu-command/src/filesystem/glob.rs index 7d7bc42b8..b0360b767 100644 --- a/crates/nu-command/src/filesystem/glob.rs +++ b/crates/nu-command/src/filesystem/glob.rs @@ -148,7 +148,7 @@ impl Command for Glob { }) = call.get_flag(engine_state, stack, "not")? { - let p = convert_patterns(pats.as_slice(), span)?; + let p = convert_patterns(pats.as_slice())?; (p, pat_span) } else { (vec![], span) @@ -226,14 +226,14 @@ impl Command for Glob { } } -fn convert_patterns(columns: &[Value], span: Span) -> Result, ShellError> { +fn convert_patterns(columns: &[Value]) -> Result, ShellError> { let res = columns .iter() .map(|value| match &value { Value::String { val: s, .. } => Ok(s.clone()), _ => Err(ShellError::IncompatibleParametersSingle { msg: "Incorrect column format, Only string as column name".to_string(), - span: value.span().unwrap_or(span), + span: value.span(), }), }) .collect::, _>>()?; diff --git a/crates/nu-command/src/filesystem/ls.rs b/crates/nu-command/src/filesystem/ls.rs index fd9a4c147..2b47e6031 100644 --- a/crates/nu-command/src/filesystem/ls.rs +++ b/crates/nu-command/src/filesystem/ls.rs @@ -257,11 +257,13 @@ impl Command for Ls { Ok(value) => Some(value), Err(err) => Some(Value::Error { error: Box::new(err), + span: call_span, }), } } Err(err) => Some(Value::Error { error: Box::new(err), + span: call_span, }), } } diff --git a/crates/nu-command/src/filesystem/mv.rs b/crates/nu-command/src/filesystem/mv.rs index b8b63c987..6e7e88232 100644 --- a/crates/nu-command/src/filesystem/mv.rs +++ b/crates/nu-command/src/filesystem/mv.rs @@ -202,6 +202,7 @@ impl Command for Mv { if let Err(error) = result { Some(Value::Error { error: Box::new(error), + span: spanned_source.span, }) } else if verbose { let val = match result { diff --git a/crates/nu-command/src/filesystem/rm.rs b/crates/nu-command/src/filesystem/rm.rs index 486f6acfd..cd97d40d9 100644 --- a/crates/nu-command/src/filesystem/rm.rs +++ b/crates/nu-command/src/filesystem/rm.rs @@ -430,6 +430,7 @@ fn rm( let msg = format!("Could not delete {:}: {e:}", f.to_string_lossy()); Value::Error { error: Box::new(ShellError::RemoveNotPossible(msg, span)), + span, } } else if verbose { let msg = if interactive && !confirmed { @@ -452,6 +453,7 @@ fn rm( None, Vec::new(), )), + span, } } } else { @@ -464,6 +466,7 @@ fn rm( None, Vec::new(), )), + span, } } }) diff --git a/crates/nu-command/src/filesystem/save.rs b/crates/nu-command/src/filesystem/save.rs index 1f64c7975..4a4f77eb2 100644 --- a/crates/nu-command/src/filesystem/save.rs +++ b/crates/nu-command/src/filesystem/save.rs @@ -263,7 +263,7 @@ fn value_to_bytes(value: Value) -> Result, ShellError> { Ok(val.into_bytes()) } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Ok(other.as_string()?.into_bytes()), } } @@ -385,13 +385,13 @@ fn stream_to_file( Value::String { val, .. } => val.into_bytes(), Value::Binary { val, .. } => val, // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), other => { return Err(ShellError::OnlySupportsThisInputType { exp_input_type: "string or binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }); } }, diff --git a/crates/nu-command/src/filters/columns.rs b/crates/nu-command/src/filters/columns.rs index fb2fbf83b..3bcc359c3 100644 --- a/crates/nu-command/src/filters/columns.rs +++ b/crates/nu-command/src/filters/columns.rs @@ -138,12 +138,12 @@ fn getcol( .into_pipeline_data(ctrlc) .set_metadata(metadata)), // Propagate errors - PipelineData::Value(Value::Error { error }, ..) => Err(*error), + PipelineData::Value(Value::Error { error, .. }, ..) => Err(*error), PipelineData::Value(other, ..) => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), PipelineData::ExternalStream { .. } => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), diff --git a/crates/nu-command/src/filters/drop/nth.rs b/crates/nu-command/src/filters/drop/nth.rs index fe4cc9453..a0e6ccd32 100644 --- a/crates/nu-command/src/filters/drop/nth.rs +++ b/crates/nu-command/src/filters/drop/nth.rs @@ -196,7 +196,7 @@ fn extract_int_or_range( .or(range_opt) .ok_or_else(|| ShellError::TypeMismatch { err_message: "int or range".into(), - span: value.span().unwrap_or_else(|_| Span::new(0, 0)), + span: value.span(), }) } diff --git a/crates/nu-command/src/filters/each.rs b/crates/nu-command/src/filters/each.rs index 02043c05c..2d029ff05 100644 --- a/crates/nu-command/src/filters/each.rs +++ b/crates/nu-command/src/filters/each.rs @@ -157,6 +157,7 @@ with 'transpose' first."# } let input_span = x.span(); + let x_is_error = x.is_error(); match eval_block_with_early_return( &engine_state, &mut stack, @@ -169,9 +170,10 @@ with 'transpose' first."# Err(ShellError::Continue(v)) => Some(Value::nothing(v)), Err(ShellError::Break(_)) => None, Err(error) => { - let error = chain_error_with_input(error, input_span); + let error = chain_error_with_input(error, x_is_error, input_span); Some(Value::Error { error: Box::new(error), + span: input_span, }) } } @@ -196,6 +198,7 @@ with 'transpose' first."# Err(err) => { return Some(Value::Error { error: Box::new(err), + span, }) } }; @@ -207,6 +210,8 @@ with 'transpose' first."# } let input_span = x.span(); + let x_is_error = x.is_error(); + match eval_block_with_early_return( &engine_state, &mut stack, @@ -219,8 +224,12 @@ with 'transpose' first."# Err(ShellError::Continue(v)) => Some(Value::nothing(v)), Err(ShellError::Break(_)) => None, Err(error) => { - let error = Box::new(chain_error_with_input(error, input_span)); - Some(Value::Error { error }) + let error = + Box::new(chain_error_with_input(error, x_is_error, input_span)); + Some(Value::Error { + error, + span: input_span, + }) } } }) diff --git a/crates/nu-command/src/filters/filter.rs b/crates/nu-command/src/filters/filter.rs index a60b30192..7d207bab2 100644 --- a/crates/nu-command/src/filters/filter.rs +++ b/crates/nu-command/src/filters/filter.rs @@ -102,7 +102,8 @@ a variable. On the other hand, the "row condition" syntax is not supported."# } } Err(error) => Some(Value::Error { - error: Box::new(chain_error_with_input(error, x.span())), + error: Box::new(chain_error_with_input(error, x.is_error(), x.span())), + span: x.span(), }), } }) @@ -122,6 +123,7 @@ a variable. On the other hand, the "row condition" syntax is not supported."# Err(err) => { return Some(Value::Error { error: Box::new(err), + span, }) } }; @@ -149,7 +151,8 @@ a variable. On the other hand, the "row condition" syntax is not supported."# } } Err(error) => Some(Value::Error { - error: Box::new(chain_error_with_input(error, x.span())), + error: Box::new(chain_error_with_input(error, x.is_error(), x.span())), + span: x.span(), }), } }) @@ -182,7 +185,8 @@ a variable. On the other hand, the "row condition" syntax is not supported."# } } Err(error) => Some(Value::Error { - error: Box::new(chain_error_with_input(error, x.span())), + error: Box::new(chain_error_with_input(error, x.is_error(), x.span())), + span: x.span(), }), } .into_pipeline_data(ctrlc)) diff --git a/crates/nu-command/src/filters/find.rs b/crates/nu-command/src/filters/find.rs index cba2281ec..1e0b10810 100644 --- a/crates/nu-command/src/filters/find.rs +++ b/crates/nu-command/src/filters/find.rs @@ -366,13 +366,7 @@ fn find_with_rest_and_highlight( let terms = call.rest::(&engine_state, stack, 0)?; let lower_terms = terms .iter() - .map(|v| { - if let Ok(span) = v.span() { - Value::string(v.into_string("", &config).to_lowercase(), span) - } else { - v.clone() - } - }) + .map(|v| Value::string(v.into_string("", &config).to_lowercase(), span)) .collect::>(); let style_computer = StyleComputer::from_config(&engine_state, stack); @@ -482,14 +476,14 @@ fn find_with_rest_and_highlight( } } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => return Err(*error), + Value::Error { error, .. } => return Err(*error), other => { return Err(ShellError::UnsupportedInput( "unsupported type from raw stream".into(), format!("input: {:?}", other.get_type()), span, // This line requires the Value::Error match above. - other.expect_span(), + other.span(), )); } }, @@ -510,11 +504,7 @@ fn value_should_be_printed( columns_to_search: &Vec, invert: bool, ) -> bool { - let lower_value = if let Ok(span) = value.span() { - Value::string(value.into_string("", filter_config).to_lowercase(), span) - } else { - value.clone() - }; + let lower_value = Value::string(value.into_string("", filter_config).to_lowercase(), span); let mut match_found = lower_terms.iter().any(|term| match value { Value::Bool { .. } @@ -579,7 +569,7 @@ fn record_matches_term( if !cols_to_search.contains(col) { return false; } - let lower_val = if val.span().is_ok() { + let lower_val = if !val.is_error() { Value::string( val.into_string("", filter_config).to_lowercase(), Span::test_data(), diff --git a/crates/nu-command/src/filters/first.rs b/crates/nu-command/src/filters/first.rs index 8a9660dac..5cf700e88 100644 --- a/crates/nu-command/src/filters/first.rs +++ b/crates/nu-command/src/filters/first.rs @@ -164,12 +164,12 @@ fn first_helper( } } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary or range".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), }, PipelineData::ListStream(mut ls, metadata) => { diff --git a/crates/nu-command/src/filters/flatten.rs b/crates/nu-command/src/filters/flatten.rs index 8b91d542e..7f23fc442 100644 --- a/crates/nu-command/src/filters/flatten.rs +++ b/crates/nu-command/src/filters/flatten.rs @@ -175,11 +175,8 @@ enum TableInside<'a> { }, } -fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span, all: bool) -> Vec { - let tag = match item.span() { - Ok(x) => x, - Err(e) => return vec![Value::Error { error: Box::new(e) }], - }; +fn flat_value(columns: &[CellPath], item: &Value, name_tag: Span, all: bool) -> Vec { + let tag = item.span(); if item.as_record().is_ok() { let mut out = IndexMap::::new(); @@ -194,17 +191,15 @@ fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span, all: bool) -> error: Box::new(ShellError::OnlySupportsThisInputType { exp_input_type: "record".into(), wrong_type: other.get_type().to_string(), - dst_span: _name_tag, - src_span: other.expect_span(), + dst_span: name_tag, + src_span: other.span(), }), + span: name_tag, }]; } }; - let s = match item.span() { - Ok(x) => x, - Err(e) => return vec![Value::Error { error: Box::new(e) }], - }; + let s = item.span(); for (column_index, (column, value)) in record.iter().enumerate() { let column_requested = columns.iter().find(|c| c.into_string() == *column); @@ -233,7 +228,7 @@ fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span, all: bool) -> "value originates from here".into(), s, *span - ))} + )), span: *span} ]; } // it's a table (a list of record, we can flatten inner record) @@ -269,7 +264,7 @@ fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span, all: bool) -> "value originates from here".into(), s, *span - ))} + )), span: *span} ]; } diff --git a/crates/nu-command/src/filters/headers.rs b/crates/nu-command/src/filters/headers.rs index 6de7eeab4..b824c3b5d 100644 --- a/crates/nu-command/src/filters/headers.rs +++ b/crates/nu-command/src/filters/headers.rs @@ -121,7 +121,7 @@ fn replace_headers( } _ => Err(ShellError::TypeMismatch { err_message: "record".to_string(), - span: value.span()?, + span: value.span(), }), } } @@ -148,7 +148,7 @@ fn extract_headers( return Err(ShellError::TypeMismatch { err_message: "needs compatible type: Null, String, Bool, Float, Int" .to_string(), - span: v.span()?, + span: v.span(), }); } } @@ -185,7 +185,7 @@ fn extract_headers( })?, _ => Err(ShellError::TypeMismatch { err_message: "record".to_string(), - span: value.span()?, + span: value.span(), }), } } diff --git a/crates/nu-command/src/filters/insert.rs b/crates/nu-command/src/filters/insert.rs index a52b692ef..42a6dcf0e 100644 --- a/crates/nu-command/src/filters/insert.rs +++ b/crates/nu-command/src/filters/insert.rs @@ -173,12 +173,18 @@ fn insert( pd.into_value(span), span, ) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input } - Err(e) => Value::Error { error: Box::new(e) }, + Err(e) => Value::Error { + error: Box::new(e), + span, + }, } }, ctrlc, @@ -209,7 +215,10 @@ fn insert( if let Err(e) = input.insert_data_at_cell_path(&cell_path.members, replacement, span) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input diff --git a/crates/nu-command/src/filters/items.rs b/crates/nu-command/src/filters/items.rs index 3e0a9337d..dc93a9f2a 100644 --- a/crates/nu-command/src/filters/items.rs +++ b/crates/nu-command/src/filters/items.rs @@ -1,4 +1,3 @@ -use super::utils::chain_error_with_input; use nu_engine::{eval_block_with_early_return, CallExt}; use nu_protocol::ast::Call; use nu_protocol::engine::{Closure, Command, EngineState, Stack}; @@ -7,6 +6,8 @@ use nu_protocol::{ SyntaxShape, Type, Value, }; +use super::utils::chain_error_with_input; + #[derive(Clone)] pub struct Items; @@ -85,9 +86,10 @@ impl Command for Items { Ok(v) => Some(v.into_value(span)), Err(ShellError::Break(_)) => None, Err(error) => { - let error = chain_error_with_input(error, Ok(input_span)); + let error = chain_error_with_input(error, false, input_span); Some(Value::Error { error: Box::new(error), + span, }) } } @@ -105,12 +107,12 @@ impl Command for Items { dst_span: call.head, src_span: input_span, }), - PipelineData::Value(Value::Error { error }, ..) => Err(*error), + PipelineData::Value(Value::Error { error, .. }, ..) => Err(*error), PipelineData::Value(other, ..) => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record".into(), wrong_type: other.get_type().to_string(), dst_span: call.head, - src_span: other.expect_span(), + src_span: other.span(), }), PipelineData::ExternalStream { .. } => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record".into(), diff --git a/crates/nu-command/src/filters/last.rs b/crates/nu-command/src/filters/last.rs index c33febe9b..d66f34df4 100644 --- a/crates/nu-command/src/filters/last.rs +++ b/crates/nu-command/src/filters/last.rs @@ -170,12 +170,12 @@ impl Command for Last { } } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary or range".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), }, PipelineData::ExternalStream { span, .. } => { diff --git a/crates/nu-command/src/filters/length.rs b/crates/nu-command/src/filters/length.rs index ebcfb2475..c1fb54c60 100644 --- a/crates/nu-command/src/filters/length.rs +++ b/crates/nu-command/src/filters/length.rs @@ -74,7 +74,7 @@ fn length_row(call: &Call, input: PipelineData) -> Result { match val { // Propagate existing errors - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), _ => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "string or raw data".into(), wrong_type: val.get_type().to_string(), dst_span: head, - src_span: val.expect_span(), + src_span: val.span(), }), } } @@ -131,6 +131,7 @@ impl Command for Lines { Ok(x) => x, Err(err) => Value::Error { error: Box::new(err), + span: head, }, }) .into_pipeline_data(ctrlc)), @@ -234,13 +235,13 @@ impl Iterator for RawStreamLinesAdapter { self.queue.append(&mut lines); } // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => return Some(Err(*error)), + Value::Error { error, .. } => return Some(Err(*error)), other => { return Some(Err(ShellError::OnlySupportsThisInputType { exp_input_type: "string".into(), wrong_type: other.get_type().to_string(), dst_span: self.span, - src_span: other.expect_span(), + src_span: other.span(), })); } } diff --git a/crates/nu-command/src/filters/merge.rs b/crates/nu-command/src/filters/merge.rs index 06a18985c..b5e4df20b 100644 --- a/crates/nu-command/src/filters/merge.rs +++ b/crates/nu-command/src/filters/merge.rs @@ -115,11 +115,13 @@ repeating this process with row 1, and so on."# Ok(to_merge) => Value::record(do_merge(inp, to_merge), call.head), Err(error) => Value::Error { error: Box::new(error), + span: call.head, }, }, (_, None) => inp, (Err(error), _) => Value::Error { error: Box::new(error), + span: call.head, }, }); @@ -137,10 +139,10 @@ repeating this process with row 1, and so on."# (PipelineData::Value(val, ..), ..) => { // Only point the "value originates here" arrow at the merge value // if it was generated from a block. Otherwise, point at the pipeline value. -Leon 2022-10-27 - let span = if val.span()? == Span::test_data() { + let span = if val.span() == Span::test_data() { Span::new(call.head.start, call.head.start) } else { - val.span()? + val.span() }; Err(ShellError::PipelineMismatch { diff --git a/crates/nu-command/src/filters/move_.rs b/crates/nu-command/src/filters/move_.rs index 30593f91c..d8aed5cfc 100644 --- a/crates/nu-command/src/filters/move_.rs +++ b/crates/nu-command/src/filters/move_.rs @@ -117,11 +117,11 @@ impl Command for Move { let before_or_after = match (after, before) { (Some(v), None) => Spanned { item: BeforeOrAfter::After(v.as_string()?), - span: v.span()?, + span: v.span(), }, (None, Some(v)) => Spanned { item: BeforeOrAfter::Before(v.as_string()?), - span: v.span()?, + span: v.span(), }, (Some(_), Some(_)) => { return Err(ShellError::GenericError( @@ -155,11 +155,13 @@ impl Command for Move { Ok(val) => val, Err(error) => Value::Error { error: Box::new(error), + span: call.head, }, } } Err(error) => Value::Error { error: Box::new(error), + span: call.head, }, }); @@ -233,7 +235,7 @@ fn move_record_columns( return Err(ShellError::GenericError( "Cannot move columns".to_string(), "column does not exist".to_string(), - Some(column.span()?), + Some(column.span()), None, Vec::new(), )); diff --git a/crates/nu-command/src/filters/par_each.rs b/crates/nu-command/src/filters/par_each.rs index b3bfc262d..4f745f383 100644 --- a/crates/nu-command/src/filters/par_each.rs +++ b/crates/nu-command/src/filters/par_each.rs @@ -142,6 +142,8 @@ impl Command for ParEach { } let val_span = x.span(); + let x_is_error = x.is_error(); + match eval_block_with_early_return( engine_state, &mut stack, @@ -153,7 +155,10 @@ impl Command for ParEach { Ok(v) => v.into_value(span), Err(error) => Value::Error { - error: Box::new(chain_error_with_input(error, val_span)), + error: Box::new(chain_error_with_input( + error, x_is_error, val_span, + )), + span: val_span, }, } }) @@ -176,6 +181,8 @@ impl Command for ParEach { } let val_span = x.span(); + let x_is_error = x.is_error(); + match eval_block_with_early_return( engine_state, &mut stack, @@ -186,7 +193,10 @@ impl Command for ParEach { ) { Ok(v) => v.into_value(span), Err(error) => Value::Error { - error: Box::new(chain_error_with_input(error, val_span)), + error: Box::new(chain_error_with_input( + error, x_is_error, val_span, + )), + span: val_span, }, } }) @@ -209,6 +219,8 @@ impl Command for ParEach { } let val_span = x.span(); + let x_is_error = x.is_error(); + match eval_block_with_early_return( engine_state, &mut stack, @@ -219,7 +231,10 @@ impl Command for ParEach { ) { Ok(v) => v.into_value(span), Err(error) => Value::Error { - error: Box::new(chain_error_with_input(error, val_span)), + error: Box::new(chain_error_with_input( + error, x_is_error, val_span, + )), + span: val_span, }, } }) @@ -240,6 +255,7 @@ impl Command for ParEach { Err(err) => { return Value::Error { error: Box::new(err), + span, } } }; @@ -265,6 +281,7 @@ impl Command for ParEach { Ok(v) => v.into_value(span), Err(error) => Value::Error { error: Box::new(error), + span, }, } }) diff --git a/crates/nu-command/src/filters/rename.rs b/crates/nu-command/src/filters/rename.rs index 546ca55e9..69c883651 100644 --- a/crates/nu-command/src/filters/rename.rs +++ b/crates/nu-command/src/filters/rename.rs @@ -122,7 +122,7 @@ fn rename( return Err(ShellError::TypeMismatch { err_message: "The column list cannot be empty and must contain only two values: the column's name and its replacement value" .to_string(), span: column_span }); } else { - (Some(columns[0].span()?), column_span) + (Some(columns[0].span()), column_span) } } else { (None, call.head) @@ -180,9 +180,19 @@ fn rename( redirect_stderr, ); match eval_result { - Err(e) => return Value::Error { error: Box::new(e) }, + Err(e) => { + return Value::Error { + error: Box::new(e), + span, + } + } Ok(res) => match res.collect_string_strict(span) { - Err(e) => return Value::Error { error: Box::new(e) }, + Err(e) => { + return Value::Error { + error: Box::new(e), + span, + } + } Ok(new_c) => *c = new_c.0, }, } @@ -204,6 +214,7 @@ fn rename( // Arrow 2 points at the input value. span, )), + span, }; } for (idx, val) in record.cols.iter_mut().enumerate() { @@ -234,8 +245,9 @@ fn rename( exp_input_type: "record".into(), wrong_type: other.get_type().to_string(), dst_span: head_span, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head_span, }, }, engine_state.ctrlc.clone(), diff --git a/crates/nu-command/src/filters/select.rs b/crates/nu-command/src/filters/select.rs index edd40b2d0..80d07ce79 100644 --- a/crates/nu-command/src/filters/select.rs +++ b/crates/nu-command/src/filters/select.rs @@ -64,14 +64,14 @@ produce a table, a list will produce a list, and a record will produce a record. let columns: Vec = call.rest(engine_state, stack, 0)?; let mut new_columns: Vec = vec![]; for col_val in columns { - let col_span = &col_val.span()?; + let col_span = &col_val.span(); match col_val { Value::CellPath { val, .. } => { new_columns.push(val); } Value::List { vals, .. } => { for value in vals { - let val_span = &value.span()?; + let val_span = &value.span(); match value { Value::String { val, .. } => { let cv = CellPath { @@ -97,7 +97,7 @@ produce a table, a list will produce a list, and a record will produce a record. return Err(ShellError::CantConvert { to_type: "cell path".into(), from_type: y.get_type().to_string(), - span: y.span()?, + span: y.span(), help: None, }); } @@ -128,7 +128,7 @@ produce a table, a list will produce a list, and a record will produce a record. return Err(ShellError::CantConvert { to_type: "cell path".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }); } diff --git a/crates/nu-command/src/filters/split_by.rs b/crates/nu-command/src/filters/split_by.rs index a62e26aa5..be2324a9a 100644 --- a/crates/nu-command/src/filters/split_by.rs +++ b/crates/nu-command/src/filters/split_by.rs @@ -163,7 +163,7 @@ pub fn split( None => Err(ShellError::CantFindColumn { col_name: column_name.item.to_string(), span: column_name.span, - src_span: row.span().unwrap_or(column_name.span), + src_span: row.span(), }), }, ); diff --git a/crates/nu-command/src/filters/take/take_.rs b/crates/nu-command/src/filters/take/take_.rs index 53f066cb7..10d13a475 100644 --- a/crates/nu-command/src/filters/take/take_.rs +++ b/crates/nu-command/src/filters/take/take_.rs @@ -73,12 +73,12 @@ impl Command for Take { .into_pipeline_data(ctrlc) .set_metadata(metadata)), // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary or range".into(), wrong_type: other.get_type().to_string(), dst_span: call.head, - src_span: other.expect_span(), + src_span: other.span(), }), }, PipelineData::ListStream(ls, metadata) => Ok(ls diff --git a/crates/nu-command/src/filters/transpose.rs b/crates/nu-command/src/filters/transpose.rs index 822ae6187..d90331d6e 100644 --- a/crates/nu-command/src/filters/transpose.rs +++ b/crates/nu-command/src/filters/transpose.rs @@ -271,7 +271,7 @@ pub fn transpose( } v => Value::List { vals: vec![v.clone(), x.clone()], - span: v.expect_span(), + span: v.span(), }, }; record.cols.remove(index); @@ -309,7 +309,7 @@ pub fn transpose( } v => Value::List { vals: vec![v.clone(), Value::nothing(name)], - span: v.expect_span(), + span: v.span(), }, }; record.cols.remove(index); diff --git a/crates/nu-command/src/filters/update.rs b/crates/nu-command/src/filters/update.rs index 0e7a2137a..f54229022 100644 --- a/crates/nu-command/src/filters/update.rs +++ b/crates/nu-command/src/filters/update.rs @@ -140,7 +140,12 @@ fn update( let input_at_path = match input.clone().follow_cell_path(&cell_path.members, false) { - Err(e) => return Value::Error { error: Box::new(e) }, + Err(e) => { + return Value::Error { + error: Box::new(e), + span, + } + } Ok(v) => v, }; let output = eval_block( @@ -157,12 +162,18 @@ fn update( if let Err(e) = input.update_data_at_cell_path(&cell_path.members, pd.into_value(span)) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input } - Err(e) => Value::Error { error: Box::new(e) }, + Err(e) => Value::Error { + error: Box::new(e), + span, + }, } }, ctrlc, @@ -199,7 +210,10 @@ fn update( let replacement = replacement.clone(); if let Err(e) = input.update_data_at_cell_path(&cell_path.members, replacement) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input diff --git a/crates/nu-command/src/filters/upsert.rs b/crates/nu-command/src/filters/upsert.rs index 912d64be9..56f378869 100644 --- a/crates/nu-command/src/filters/upsert.rs +++ b/crates/nu-command/src/filters/upsert.rs @@ -178,12 +178,18 @@ fn upsert( if let Err(e) = input.upsert_data_at_cell_path(&cell_path.members, pd.into_value(span)) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input } - Err(e) => Value::Error { error: Box::new(e) }, + Err(e) => Value::Error { + error: Box::new(e), + span, + }, } }, ctrlc, @@ -219,7 +225,10 @@ fn upsert( let replacement = replacement.clone(); if let Err(e) = input.upsert_data_at_cell_path(&cell_path.members, replacement) { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } input diff --git a/crates/nu-command/src/filters/utils.rs b/crates/nu-command/src/filters/utils.rs index 1853f6d0e..9e9b64cef 100644 --- a/crates/nu-command/src/filters/utils.rs +++ b/crates/nu-command/src/filters/utils.rs @@ -7,9 +7,10 @@ use nu_protocol::{ pub fn chain_error_with_input( error_source: ShellError, - input_span: Result, + input_is_error: bool, + span: Span, ) -> ShellError { - if let Ok(span) = input_span { + if !input_is_error { return ShellError::EvalBlockWithInput(span, vec![error_source]); } error_source diff --git a/crates/nu-command/src/filters/values.rs b/crates/nu-command/src/filters/values.rs index 26608e9f1..d1cb0e0b2 100644 --- a/crates/nu-command/src/filters/values.rs +++ b/crates/nu-command/src/filters/values.rs @@ -119,7 +119,7 @@ pub fn get_values<'a>( } } } - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), _ => { return Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), @@ -176,12 +176,12 @@ fn values( Ok(val.vals.into_pipeline_data(ctrlc).set_metadata(metadata)) } // Propagate errors - PipelineData::Value(Value::Error { error }, ..) => Err(*error), + PipelineData::Value(Value::Error { error, .. }, ..) => Err(*error), PipelineData::Value(other, ..) => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), PipelineData::ExternalStream { .. } => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), diff --git a/crates/nu-command/src/filters/where_.rs b/crates/nu-command/src/filters/where_.rs index f3493dd07..59e09eff7 100644 --- a/crates/nu-command/src/filters/where_.rs +++ b/crates/nu-command/src/filters/where_.rs @@ -101,6 +101,7 @@ not supported."# } Err(err) => Some(Value::Error { error: Box::new(err), + span, }), } }) diff --git a/crates/nu-command/src/formats/from/json.rs b/crates/nu-command/src/formats/from/json.rs index 6ec900399..cada9d866 100644 --- a/crates/nu-command/src/formats/from/json.rs +++ b/crates/nu-command/src/formats/from/json.rs @@ -77,6 +77,7 @@ impl Command for FromJson { Ok(v) => Some(v), Err(error) => Some(Value::Error { error: Box::new(error), + span, }), } } @@ -120,6 +121,7 @@ fn convert_nujson_to_value(value: &nu_json::Value, span: Span) -> Value { span, help: None, }), + span, } } else { Value::Int { diff --git a/crates/nu-command/src/formats/from/ods.rs b/crates/nu-command/src/formats/from/ods.rs index 8e6bbb8e7..fea867a76 100644 --- a/crates/nu-command/src/formats/from/ods.rs +++ b/crates/nu-command/src/formats/from/ods.rs @@ -45,7 +45,7 @@ impl Command for FromOds { let sel_sheets = if let Some(Value::List { vals: columns, .. }) = call.get_flag(engine_state, stack, "sheets")? { - convert_columns(columns.as_slice(), call.head)? + convert_columns(columns.as_slice())? } else { vec![] }; @@ -69,14 +69,14 @@ impl Command for FromOds { } } -fn convert_columns(columns: &[Value], span: Span) -> Result, ShellError> { +fn convert_columns(columns: &[Value]) -> Result, ShellError> { let res = columns .iter() .map(|value| match &value { Value::String { val: s, .. } => Ok(s.clone()), _ => Err(ShellError::IncompatibleParametersSingle { msg: "Incorrect column format, Only string as column name".to_string(), - span: value.span().unwrap_or(span), + span: value.span(), }), }) .collect::, _>>()?; @@ -93,13 +93,13 @@ fn collect_binary(input: PipelineData, span: Span) -> Result, ShellError Some(Value::Binary { val: b, .. }) => { bytes.extend_from_slice(&b); } - Some(Value::Error { error }) => return Err(*error), + Some(Value::Error { error, .. }) => return Err(*error), Some(x) => { return Err(ShellError::UnsupportedInput( "Expected binary from pipeline".to_string(), "value originates from here".into(), span, - x.expect_span(), + x.span(), )) } None => break, diff --git a/crates/nu-command/src/formats/from/xlsx.rs b/crates/nu-command/src/formats/from/xlsx.rs index 317cca198..28d040618 100644 --- a/crates/nu-command/src/formats/from/xlsx.rs +++ b/crates/nu-command/src/formats/from/xlsx.rs @@ -45,7 +45,7 @@ impl Command for FromXlsx { let sel_sheets = if let Some(Value::List { vals: columns, .. }) = call.get_flag(engine_state, stack, "sheets")? { - convert_columns(columns.as_slice(), call.head)? + convert_columns(columns.as_slice())? } else { vec![] }; @@ -69,14 +69,14 @@ impl Command for FromXlsx { } } -fn convert_columns(columns: &[Value], span: Span) -> Result, ShellError> { +fn convert_columns(columns: &[Value]) -> Result, ShellError> { let res = columns .iter() .map(|value| match &value { Value::String { val: s, .. } => Ok(s.clone()), _ => Err(ShellError::IncompatibleParametersSingle { msg: "Incorrect column format, Only string as column name".to_string(), - span: value.span().unwrap_or(span), + span: value.span(), }), }) .collect::, _>>()?; @@ -98,7 +98,7 @@ fn collect_binary(input: PipelineData, span: Span) -> Result, ShellError "Expected binary from pipeline".to_string(), "value originates from here".into(), span, - x.expect_span(), + x.span(), )) } None => break, diff --git a/crates/nu-command/src/formats/to/delimited.rs b/crates/nu-command/src/formats/to/delimited.rs index 5508773c1..e906c390d 100644 --- a/crates/nu-command/src/formats/to/delimited.rs +++ b/crates/nu-command/src/formats/to/delimited.rs @@ -14,8 +14,8 @@ fn from_value_to_delimited_string( Value::Record { val, span } => record_to_delimited(val, *span, separator, config, head), Value::List { vals, span } => table_to_delimited(vals, *span, separator, config, head), // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error.clone()), - v => Err(make_unsupported_input_error(v, head, v.expect_span())), + Value::Error { error, .. } => Err(*error.clone()), + v => Err(make_unsupported_input_error(v, head, v.span())), } } @@ -119,7 +119,7 @@ fn to_string_tagged_value( Value::Date { val, .. } => Ok(val.to_string()), Value::Nothing { .. } => Ok(String::new()), // Propagate existing errors - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), _ => Err(make_unsupported_input_error(v, head, span)), } } @@ -161,7 +161,7 @@ pub fn to_delimited_data( Err(_) => Err(ShellError::CantConvert { to_type: format_name.into(), from_type: value.get_type().to_string(), - span: value.span().unwrap_or(span), + span: value.span(), help: None, }), }?; diff --git a/crates/nu-command/src/formats/to/json.rs b/crates/nu-command/src/formats/to/json.rs index 518f0133b..4426a4f8c 100644 --- a/crates/nu-command/src/formats/to/json.rs +++ b/crates/nu-command/src/formats/to/json.rs @@ -76,6 +76,7 @@ impl Command for ToJson { span, help: None, }), + span, } .into_pipeline_data()), } @@ -126,7 +127,7 @@ pub fn value_to_json_value(v: &Value) -> Result { ), Value::List { vals, .. } => nu_json::Value::Array(json_list(vals)?), - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), Value::Closure { .. } | Value::Block { .. } | Value::Range { .. } diff --git a/crates/nu-command/src/formats/to/nuon.rs b/crates/nu-command/src/formats/to/nuon.rs index 306349b6e..acdefcb29 100644 --- a/crates/nu-command/src/formats/to/nuon.rs +++ b/crates/nu-command/src/formats/to/nuon.rs @@ -85,6 +85,7 @@ impl Command for ToNuon { span, help: None, }), + span, } .into_pipeline_data()), } @@ -136,7 +137,7 @@ pub fn value_to_string( "could not convert binary to string".into(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )); } } @@ -146,13 +147,13 @@ pub fn value_to_string( "blocks are currently not nuon-compatible".into(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )), Value::Closure { .. } => Err(ShellError::UnsupportedInput( "closures are currently not nuon-compatible".into(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )), Value::Bool { val, .. } => { if *val { @@ -165,19 +166,19 @@ pub fn value_to_string( "cellpaths are currently not nuon-compatible".to_string(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )), Value::CustomValue { .. } => Err(ShellError::UnsupportedInput( "custom values are currently not nuon-compatible".to_string(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )), Value::Date { val, .. } => Ok(val.to_rfc3339()), // FIXME: make durations use the shortest lossless representation. Value::Duration { val, .. } => Ok(format!("{}ns", *val)), // Propagate existing errors - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), // FIXME: make filesizes use the shortest lossless representation. Value::Filesize { val, .. } => Ok(format!("{}b", *val)), Value::Float { val, .. } => { @@ -246,7 +247,7 @@ pub fn value_to_string( "match patterns are currently not nuon-compatible".to_string(), "value originates from here".into(), span, - v.expect_span(), + v.span(), )), Value::Nothing { .. } => Ok("null".to_string()), Value::Range { val, .. } => Ok(format!( diff --git a/crates/nu-command/src/formats/to/text.rs b/crates/nu-command/src/formats/to/text.rs index 8db436a84..4ce19b475 100644 --- a/crates/nu-command/src/formats/to/text.rs +++ b/crates/nu-command/src/formats/to/text.rs @@ -148,7 +148,7 @@ fn local_into_string(value: Value, separator: &str, config: &Config) -> String { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), diff --git a/crates/nu-command/src/formats/to/toml.rs b/crates/nu-command/src/formats/to/toml.rs index aa2276779..0b9e8e176 100644 --- a/crates/nu-command/src/formats/to/toml.rs +++ b/crates/nu-command/src/formats/to/toml.rs @@ -77,7 +77,7 @@ fn helper(engine_state: &EngineState, v: &Value) -> Result toml::Value::String("".to_string()), - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), Value::Binary { val, .. } => toml::Value::Array( val.iter() .map(|x| toml::Value::Integer(*x as i64)) @@ -125,6 +125,7 @@ fn toml_into_pipeline_data( span, help: None, }), + span, } .into_pipeline_data()), } @@ -138,12 +139,12 @@ fn value_to_toml_value( match v { Value::Record { .. } => helper(engine_state, v), // Propagate existing errors - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), _ => Err(ShellError::UnsupportedInput( format!("{:?} is not valid top-level TOML", v.get_type()), "value originates from here".into(), head, - v.expect_span(), + v.span(), )), } } diff --git a/crates/nu-command/src/formats/to/xml.rs b/crates/nu-command/src/formats/to/xml.rs index 796d4a1f6..57663b0b9 100644 --- a/crates/nu-command/src/formats/to/xml.rs +++ b/crates/nu-command/src/formats/to/xml.rs @@ -97,7 +97,7 @@ fn to_xml_entry( top_level: bool, writer: &mut quick_xml::Writer, ) -> Result<(), ShellError> { - let entry_span = entry.span()?; + let entry_span = entry.span(); // Allow using strings directly as content. // So user can write @@ -197,7 +197,7 @@ fn to_tag_like( return Err(ShellError::CantConvert { to_type: "XML".into(), from_type: Type::Record(vec![]).to_string(), - span: content.span()?, + span: content.span(), help: Some("PI content expected to be a string".into()), }); } @@ -215,7 +215,7 @@ fn to_tag_like( return Err(ShellError::CantConvert { to_type: "XML".into(), from_type: attrs.get_type().to_string(), - span: attrs.span()?, + span: attrs.span(), help: Some("Tag attributes expected to be a record".into()), }); } @@ -228,7 +228,7 @@ fn to_tag_like( return Err(ShellError::CantConvert { to_type: "XML".into(), from_type: content.get_type().to_string(), - span: content.span()?, + span: content.span(), help: Some("Tag content expected to be a list".into()), }); } @@ -350,7 +350,7 @@ fn parse_attributes(attrs: Record) -> Result, ShellErro return Err(ShellError::CantConvert { to_type: "XML".to_string(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: Some("Attribute value expected to be a string".into()), }); } diff --git a/crates/nu-command/src/formats/to/yaml.rs b/crates/nu-command/src/formats/to/yaml.rs index a3f23d720..a6fee7450 100644 --- a/crates/nu-command/src/formats/to/yaml.rs +++ b/crates/nu-command/src/formats/to/yaml.rs @@ -79,7 +79,7 @@ pub fn value_to_yaml_value(v: &Value) -> Result { Value::Block { .. } => serde_yaml::Value::Null, Value::Closure { .. } => serde_yaml::Value::Null, Value::Nothing { .. } => serde_yaml::Value::Null, - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), Value::Binary { val, .. } => serde_yaml::Value::Sequence( val.iter() .map(|x| serde_yaml::Value::Number(serde_yaml::Number::from(*x))) @@ -118,6 +118,7 @@ fn to_yaml(input: PipelineData, head: Span) -> Result span: head, help: None, }), + span: head, } .into_pipeline_data()), } diff --git a/crates/nu-command/src/generators/seq_date.rs b/crates/nu-command/src/generators/seq_date.rs index 882edbde1..79c6e936d 100644 --- a/crates/nu-command/src/generators/seq_date.rs +++ b/crates/nu-command/src/generators/seq_date.rs @@ -197,7 +197,7 @@ pub fn run_seq_dates( return Err(ShellError::GenericError( "increment cannot be 0".to_string(), "increment cannot be 0".to_string(), - Some(increment.span()?), + Some(increment.span()), None, Vec::new(), )); diff --git a/crates/nu-command/src/hash/generic_digest.rs b/crates/nu-command/src/hash/generic_digest.rs index c88d6f2a4..cbbe4b105 100644 --- a/crates/nu-command/src/hash/generic_digest.rs +++ b/crates/nu-command/src/hash/generic_digest.rs @@ -112,8 +112,9 @@ where exp_input_type: "string and binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, } .into_pipeline_data()); } @@ -157,22 +158,16 @@ where // Propagate existing errors Value::Error { .. } => return input.clone(), other => { - let span = match input.span() { - Ok(span) => span, - Err(error) => { - return Value::Error { - error: Box::new(error), - } - } - }; + let span = input.span(); return Value::Error { error: Box::new(ShellError::OnlySupportsThisInputType { exp_input_type: "string or binary".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), + span, }; } }; diff --git a/crates/nu-command/src/help/help_.rs b/crates/nu-command/src/help/help_.rs index d203e9500..765934d54 100644 --- a/crates/nu-command/src/help/help_.rs +++ b/crates/nu-command/src/help/help_.rs @@ -154,7 +154,7 @@ pub fn highlight_search_in_table( return Err(ShellError::NushellFailedSpanned { msg: "Expected record".to_string(), label: format!("got {}", record.get_type()), - span: record.span()?, + span: record.span(), }); }; diff --git a/crates/nu-command/src/hook.rs b/crates/nu-command/src/hook.rs index c83a864e2..4c82eaa46 100644 --- a/crates/nu-command/src/hook.rs +++ b/crates/nu-command/src/hook.rs @@ -44,7 +44,7 @@ pub fn eval_env_change_hook( x => { return Err(ShellError::TypeMismatch { err_message: "record for the 'env_change' hook".to_string(), - span: x.span()?, + span: x.span(), }); } } @@ -60,7 +60,7 @@ pub fn eval_hook( arguments: Vec<(String, Value)>, value: &Value, ) -> Result { - let value_span = value.span()?; + let value_span = value.span(); // Hooks can optionally be a record in this form: // { @@ -92,7 +92,7 @@ pub fn eval_hook( for (name, val) in arguments { let var_id = working_set.add_variable( name.as_bytes().to_vec(), - val.span()?, + val.span(), Type::Any, false, ); @@ -191,7 +191,7 @@ pub fn eval_hook( return Err(ShellError::UnsupportedConfigValue( "block".to_string(), format!("{}", other.get_type()), - other.span()?, + other.span(), )); } } @@ -214,7 +214,7 @@ pub fn eval_hook( for (name, val) in arguments { let var_id = working_set.add_variable( name.as_bytes().to_vec(), - val.span()?, + val.span(), Type::Any, false, ); @@ -293,7 +293,7 @@ pub fn eval_hook( return Err(ShellError::UnsupportedConfigValue( "block or string".to_string(), format!("{}", other.get_type()), - other.span()?, + other.span(), )); } } @@ -331,7 +331,7 @@ pub fn eval_hook( return Err(ShellError::UnsupportedConfigValue( "string, block, record, or list of commands".into(), format!("{}", other.get_type()), - other.span()?, + other.span(), )); } } @@ -374,7 +374,7 @@ fn run_hook_block( let pipeline_data = eval_block_with_early_return(engine_state, &mut callee_stack, block, input, false, false)?; - if let PipelineData::Value(Value::Error { error }, _) = pipeline_data { + if let PipelineData::Value(Value::Error { error, .. }, _) = pipeline_data { return Err(*error); } diff --git a/crates/nu-command/src/math/abs.rs b/crates/nu-command/src/math/abs.rs index 75dae0630..82f4a0098 100644 --- a/crates/nu-command/src/math/abs.rs +++ b/crates/nu-command/src/math/abs.rs @@ -83,8 +83,9 @@ fn abs_helper(val: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/math/ceil.rs b/crates/nu-command/src/math/ceil.rs index e345e5a24..c6d12a5dd 100644 --- a/crates/nu-command/src/math/ceil.rs +++ b/crates/nu-command/src/math/ceil.rs @@ -74,8 +74,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/math/floor.rs b/crates/nu-command/src/math/floor.rs index f60958254..416558c61 100644 --- a/crates/nu-command/src/math/floor.rs +++ b/crates/nu-command/src/math/floor.rs @@ -74,8 +74,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/math/log.rs b/crates/nu-command/src/math/log.rs index 733c3b43e..a7b40a3db 100644 --- a/crates/nu-command/src/math/log.rs +++ b/crates/nu-command/src/math/log.rs @@ -109,6 +109,7 @@ fn operate(value: Value, head: Span, base: f64) -> Value { head, span, )), + span, }; } // Specialize for better precision/performance @@ -128,8 +129,9 @@ fn operate(value: Value, head: Span, base: f64) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/math/median.rs b/crates/nu-command/src/math/median.rs index 99a463989..d4d29524e 100644 --- a/crates/nu-command/src/math/median.rs +++ b/crates/nu-command/src/math/median.rs @@ -90,9 +90,9 @@ pub fn median(values: &[Value], span: Span, head: Span) -> Result Result Result { Ok(HashableType::new(val.to_ne_bytes(), NumberTypes::Filesize)) } - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), other => Err(ShellError::UnsupportedInput( "Unable to give a result with this input".to_string(), "value originates from here".into(), head, - other.expect_span(), + other.span(), )), }) .collect::, ShellError>>()?; diff --git a/crates/nu-command/src/math/reducers.rs b/crates/nu-command/src/math/reducers.rs index d92653448..b7b130d2a 100644 --- a/crates/nu-command/src/math/reducers.rs +++ b/crates/nu-command/src/math/reducers.rs @@ -42,9 +42,9 @@ pub fn max(data: Vec, span: Span, head: Span) -> Result, span: Span, head: Span) -> Result, span: Span, head: Span) -> Result { acc = acc.add(head, value, head)?; } - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), other => { return Err(ShellError::UnsupportedInput( "Attempted to compute the sum of a value that cannot be summed".to_string(), "value originates from here".into(), head, - other.expect_span(), + other.span(), )); } } @@ -145,14 +145,14 @@ pub fn product(data: Vec, span: Span, head: Span) -> Result { acc = acc.mul(head, value, head)?; } - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), other => { return Err(ShellError::UnsupportedInput( "Attempted to compute the product of a value that cannot be multiplied" .to_string(), "value originates from here".into(), head, - other.expect_span(), + other.span(), )); } } diff --git a/crates/nu-command/src/math/round.rs b/crates/nu-command/src/math/round.rs index ebe60b23d..3e9277ebf 100644 --- a/crates/nu-command/src/math/round.rs +++ b/crates/nu-command/src/math/round.rs @@ -126,8 +126,9 @@ fn operate(value: Value, head: Span, precision: Option) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/math/sqrt.rs b/crates/nu-command/src/math/sqrt.rs index 85b3134ff..baf34c45e 100644 --- a/crates/nu-command/src/math/sqrt.rs +++ b/crates/nu-command/src/math/sqrt.rs @@ -83,8 +83,9 @@ fn operate(value: Value, head: Span) -> Value { exp_input_type: "numeric".into(), wrong_type: other.get_type().to_string(), dst_span: head, - src_span: other.expect_span(), + src_span: other.span(), }), + span: head, }, } } @@ -97,6 +98,7 @@ fn error_negative_sqrt(head: Span, span: Span) -> Value { head, span, )), + span, } } diff --git a/crates/nu-command/src/math/utils.rs b/crates/nu-command/src/math/utils.rs index a704b1ddc..bed730d21 100644 --- a/crates/nu-command/src/math/utils.rs +++ b/crates/nu-command/src/math/utils.rs @@ -34,10 +34,10 @@ fn helper_for_tables( .or_insert_with(|| vec![value.clone()]); } } - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), _ => { //Turns out we are not dealing with a table - return mf(values, val.expect_span(), name); + return mf(values, val.span(), name); } } } diff --git a/crates/nu-command/src/math/variance.rs b/crates/nu-command/src/math/variance.rs index 6437a9013..3f470e7a8 100644 --- a/crates/nu-command/src/math/variance.rs +++ b/crates/nu-command/src/math/variance.rs @@ -64,13 +64,13 @@ fn sum_of_squares(values: &[Value], span: Span) -> Result { for value in values { let v = match &value { Value::Int { .. } | Value::Float { .. } => Ok(value), - Value::Error { error } => Err(*error.clone()), + Value::Error { error, .. } => Err(*error.clone()), _ => Err(ShellError::UnsupportedInput( "Attempted to compute the sum of squares of a non-integer, non-float value" .to_string(), "value originates from here".into(), span, - value.expect_span(), + value.span(), )), }?; let v_squared = &v.mul(span, v, span)?; diff --git a/crates/nu-command/src/network/http/client.rs b/crates/nu-command/src/network/http/client.rs index bf203f567..8e468024d 100644 --- a/crates/nu-command/src/network/http/client.rs +++ b/crates/nu-command/src/network/http/client.rs @@ -278,7 +278,7 @@ pub fn request_set_timeout( if val.is_negative() || val < 1 { return Err(ShellError::TypeMismatch { err_message: "Timeout value must be an integer and larger than 0".to_string(), - span: timeout.expect_span(), + span: timeout.span(), }); } @@ -316,7 +316,7 @@ pub fn request_add_custom_headers( return Err(ShellError::CantConvert { to_type: "string list or single row".into(), from_type: x.get_type().to_string(), - span: headers.span().unwrap_or_else(|_| Span::new(0, 0)), + span: headers.span(), help: None, }); } @@ -335,7 +335,7 @@ pub fn request_add_custom_headers( return Err(ShellError::CantConvert { to_type: "string list or single row".into(), from_type: x.get_type().to_string(), - span: headers.span().unwrap_or_else(|_| Span::new(0, 0)), + span: headers.span(), help: None, }); } diff --git a/crates/nu-command/src/network/http/delete.rs b/crates/nu-command/src/network/http/delete.rs index 83c399156..eb574d1e8 100644 --- a/crates/nu-command/src/network/http/delete.rs +++ b/crates/nu-command/src/network/http/delete.rs @@ -183,7 +183,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/http/get.rs b/crates/nu-command/src/network/http/get.rs index eb3ffbed6..3bd613abd 100644 --- a/crates/nu-command/src/network/http/get.rs +++ b/crates/nu-command/src/network/http/get.rs @@ -167,7 +167,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/http/head.rs b/crates/nu-command/src/network/http/head.rs index 69ff026e4..d6b4a8603 100644 --- a/crates/nu-command/src/network/http/head.rs +++ b/crates/nu-command/src/network/http/head.rs @@ -141,7 +141,7 @@ fn helper( args: Arguments, ctrlc: Option>, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let (requested_url, _) = http_parse_url(call, span, args.url)?; let client = http_client(args.insecure); diff --git a/crates/nu-command/src/network/http/options.rs b/crates/nu-command/src/network/http/options.rs index 7449fcbbb..43035e123 100644 --- a/crates/nu-command/src/network/http/options.rs +++ b/crates/nu-command/src/network/http/options.rs @@ -156,7 +156,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/http/patch.rs b/crates/nu-command/src/network/http/patch.rs index 27fc1c024..f94d10e8d 100644 --- a/crates/nu-command/src/network/http/patch.rs +++ b/crates/nu-command/src/network/http/patch.rs @@ -173,7 +173,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/http/post.rs b/crates/nu-command/src/network/http/post.rs index bcdb0de8a..bf0b3a081 100644 --- a/crates/nu-command/src/network/http/post.rs +++ b/crates/nu-command/src/network/http/post.rs @@ -173,7 +173,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/http/put.rs b/crates/nu-command/src/network/http/put.rs index be6a26cb5..8b49e40ae 100644 --- a/crates/nu-command/src/network/http/put.rs +++ b/crates/nu-command/src/network/http/put.rs @@ -173,7 +173,7 @@ fn helper( call: &Call, args: Arguments, ) -> Result { - let span = args.url.span()?; + let span = args.url.span(); let ctrl_c = engine_state.ctrlc.clone(); let (requested_url, _) = http_parse_url(call, span, args.url)?; diff --git a/crates/nu-command/src/network/url/build_query.rs b/crates/nu-command/src/network/url/build_query.rs index 4f6a9abad..3c397c36e 100644 --- a/crates/nu-command/src/network/url/build_query.rs +++ b/crates/nu-command/src/network/url/build_query.rs @@ -94,12 +94,12 @@ fn to_url(input: PipelineData, head: Span) -> Result { } } // Propagate existing errors - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::UnsupportedInput( "Expected a table from pipeline".to_string(), "value originates from here".into(), head, - other.expect_span(), + other.span(), )), }) .collect(); diff --git a/crates/nu-command/src/network/url/encode.rs b/crates/nu-command/src/network/url/encode.rs index df1596923..60b7d31a5 100644 --- a/crates/nu-command/src/network/url/encode.rs +++ b/crates/nu-command/src/network/url/encode.rs @@ -109,8 +109,9 @@ fn action_all(input: &Value, _arg: &CellPathOnlyArgs, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } @@ -130,8 +131,9 @@ fn action(input: &Value, _arg: &CellPathOnlyArgs, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/network/url/join.rs b/crates/nu-command/src/network/url/join.rs index f9869b7c5..f36613af3 100644 --- a/crates/nu-command/src/network/url/join.rs +++ b/crates/nu-command/src/network/url/join.rs @@ -101,12 +101,12 @@ impl Command for SubCommand { url_components?.to_url(span) } - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::UnsupportedInput( "Expected a record from pipeline".to_string(), "value originates from here".into(), head, - other.expect_span(), + other.span(), )), }) .collect(); @@ -159,12 +159,12 @@ impl UrlComponents { port: Some(val), ..self }), - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::IncompatibleParametersSingle { msg: String::from( "Port parameter should be an unsigned integer or a string representing it", ), - span: other.expect_span(), + span: other.span(), }), }; } @@ -192,7 +192,7 @@ impl UrlComponents { // if query is present it means that also query_span is set. return Err(ShellError::IncompatibleParameters { left_message: format!("Mismatch, qs from params is: {qs}"), - left_span: value.expect_span(), + left_span: value.span(), right_message: format!("instead query is: {q}"), right_span: self.query_span.unwrap_or(Span::unknown()), }); @@ -205,10 +205,10 @@ impl UrlComponents { ..self }) } - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::IncompatibleParametersSingle { msg: String::from("Key params has to be a record"), - span: other.expect_span(), + span: other.span(), }), }; } @@ -250,7 +250,7 @@ impl UrlComponents { // if query is present it means that also params_span is set. return Err(ShellError::IncompatibleParameters { left_message: format!("Mismatch, query param is: {s}"), - left_span: value.expect_span(), + left_span: value.span(), right_message: format!("instead qs from params is: {q}"), right_span: self.params_span.unwrap_or(Span::unknown()), }); @@ -259,7 +259,7 @@ impl UrlComponents { Ok(Self { query: Some(format!("?{s}")), - query_span: Some(value.expect_span()), + query_span: Some(value.span()), ..self }) } diff --git a/crates/nu-command/src/network/url/parse.rs b/crates/nu-command/src/network/url/parse.rs index f6bc11627..f2fa4a21e 100644 --- a/crates/nu-command/src/network/url/parse.rs +++ b/crates/nu-command/src/network/url/parse.rs @@ -101,7 +101,7 @@ fn parse(value: Value, head: Span, engine_state: &EngineState) -> Result { diff --git a/crates/nu-command/src/path/exists.rs b/crates/nu-command/src/path/exists.rs index d457cd51d..a531a092a 100644 --- a/crates/nu-command/src/path/exists.rs +++ b/crates/nu-command/src/path/exists.rs @@ -113,6 +113,7 @@ fn exists(path: &Path, span: Span, args: &Arguments) -> Value { Err(err) => { return Value::Error { error: Box::new(ShellError::IOErrorSpanned(err.to_string(), span)), + span, } } }, diff --git a/crates/nu-command/src/path/expand.rs b/crates/nu-command/src/path/expand.rs index 99e72e3d5..3aacd9f10 100644 --- a/crates/nu-command/src/path/expand.rs +++ b/crates/nu-command/src/path/expand.rs @@ -140,6 +140,7 @@ fn expand(path: &Path, span: Span, args: &Arguments) -> Value { None, Vec::new(), )), + span, }, } } else if args.not_follow_symlink { diff --git a/crates/nu-command/src/path/join.rs b/crates/nu-command/src/path/join.rs index 3a68f5604..4acde4cfa 100644 --- a/crates/nu-command/src/path/join.rs +++ b/crates/nu-command/src/path/join.rs @@ -188,6 +188,7 @@ fn join_list(parts: &[Value], head: Span, span: Span, args: &Arguments) -> Value dst_span: head, src_span: span, }), + span, }, } } @@ -199,6 +200,7 @@ fn join_record(record: &Record, head: Span, span: Span, args: &Arguments) -> Val Ok(p) => join_single(p.as_path(), head, args), Err(error) => Value::Error { error: Box::new(error), + span, }, } } diff --git a/crates/nu-command/src/path/mod.rs b/crates/nu-command/src/path/mod.rs index 09672b0ae..d1fc709a3 100644 --- a/crates/nu-command/src/path/mod.rs +++ b/crates/nu-command/src/path/mod.rs @@ -45,27 +45,28 @@ where fn handle_invalid_values(rest: Value, name: Span) -> Value { Value::Error { error: Box::new(err_from_value(&rest, name)), + span: name, } } fn err_from_value(rest: &Value, name: Span) -> ShellError { - match rest.span() { - Ok(span) => { + match rest { + Value::Error { error, .. } => *error.clone(), + _ => { if rest.is_nothing() { ShellError::OnlySupportsThisInputType { exp_input_type: "string, record or list".into(), wrong_type: "nothing".into(), dst_span: name, - src_span: span, + src_span: rest.span(), } } else { ShellError::PipelineMismatch { exp_input_type: "string, row or list".into(), dst_span: name, - src_span: span, + src_span: rest.span(), } } } - Err(error) => error, } } diff --git a/crates/nu-command/src/path/relative_to.rs b/crates/nu-command/src/path/relative_to.rs index 5b12986f0..15f80ff1b 100644 --- a/crates/nu-command/src/path/relative_to.rs +++ b/crates/nu-command/src/path/relative_to.rs @@ -135,6 +135,7 @@ fn relative_to(path: &Path, span: Span, args: &Arguments) -> Value { span, help: None, }), + span, }, } } diff --git a/crates/nu-command/src/platform/ansi/ansi_.rs b/crates/nu-command/src/platform/ansi/ansi_.rs index cb8ed32b1..381fcea1e 100644 --- a/crates/nu-command/src/platform/ansi/ansi_.rs +++ b/crates/nu-command/src/platform/ansi/ansi_.rs @@ -733,7 +733,7 @@ Operating system commands: return Err(ShellError::GenericError( "error parsing hex color".to_string(), format!("{err}"), - Some(code.span()?), + Some(code.span()), None, Vec::new(), )); @@ -772,7 +772,7 @@ Operating system commands: _ => { return Err(ShellError::IncompatibleParametersSingle { msg: format!("unknown ANSI format key: expected one of ['fg', 'bg', 'attr'], found '{k}'"), - span: code.expect_span(), + span: code.span(), }) } } diff --git a/crates/nu-command/src/platform/ansi/strip.rs b/crates/nu-command/src/platform/ansi/strip.rs index a0b567c59..410656c96 100644 --- a/crates/nu-command/src/platform/ansi/strip.rs +++ b/crates/nu-command/src/platform/ansi/strip.rs @@ -55,7 +55,7 @@ impl Command for SubCommand { } } -fn action(input: &Value, _args: &CellPathOnlyArgs, command_span: Span) -> Value { +fn action(input: &Value, _args: &CellPathOnlyArgs, _span: Span) -> Value { match input { Value::String { val, span } => { Value::string(nu_utils::strip_ansi_likely(val).to_string(), *span) @@ -66,8 +66,9 @@ fn action(input: &Value, _args: &CellPathOnlyArgs, command_span: Span) -> Value Value::Error { error: Box::new(ShellError::TypeMismatch { err_message: got, - span: other.span().unwrap_or(command_span), + span: other.span(), }), + span: other.span(), } } } diff --git a/crates/nu-command/src/platform/du.rs b/crates/nu-command/src/platform/du.rs index 4266793f7..3fbc5e599 100644 --- a/crates/nu-command/src/platform/du.rs +++ b/crates/nu-command/src/platform/du.rs @@ -179,7 +179,10 @@ impl Command for Du { } } Err(e) => { - output.push(Value::Error { error: Box::new(e) }); + output.push(Value::Error { + error: Box::new(e), + span: tag, + }); } } } diff --git a/crates/nu-command/src/platform/input/input_listen.rs b/crates/nu-command/src/platform/input/input_listen.rs index 4cd1ce90c..0dfcd0bf4 100644 --- a/crates/nu-command/src/platform/input/input_listen.rs +++ b/crates/nu-command/src/platform/input/input_listen.rs @@ -184,7 +184,7 @@ impl EventTypeFilter { "--types expects a list of strings".to_string(), "value originates from here".into(), head, - value.span().unwrap_or(head), + value.span(), ) } diff --git a/crates/nu-command/src/strings/detect_columns.rs b/crates/nu-command/src/strings/detect_columns.rs index 74bfa2da0..95e043efa 100644 --- a/crates/nu-command/src/strings/detect_columns.rs +++ b/crates/nu-command/src/strings/detect_columns.rs @@ -219,6 +219,7 @@ fn detect_columns( let err = processing_error("could not find range index", name_span); return Value::Error { error: Box::new(err), + span: name_span, }; } } diff --git a/crates/nu-command/src/strings/encode_decode/base64.rs b/crates/nu-command/src/strings/encode_decode/base64.rs index d6f6a419d..573d4679c 100644 --- a/crates/nu-command/src/strings/encode_decode/base64.rs +++ b/crates/nu-command/src/strings/encode_decode/base64.rs @@ -99,12 +99,12 @@ fn action( Some(config_character_set.span), None, Vec::new(), - ))} + )), span:config_character_set.span} }; match input { // Propagate existing errors. Value::Error { .. } => input.clone(), - Value::Binary { val, .. } => match base64_config.action_type { + Value::Binary { val, span } => match base64_config.action_type { ActionType::Encode => { let mut enc_vec = Vec::new(); enc_vec.resize(val.len() * 4 / 3 + 4, 0); @@ -115,10 +115,11 @@ fn action( error: Box::new(ShellError::GenericError( "Error encoding data".into(), err.to_string(), - Some(Span::unknown()), + Some(*span), None, Vec::new(), )), + span: *span, } } }; @@ -131,8 +132,9 @@ fn action( "value originates from here".into(), command_span, // This line requires the Value::Error {} match above. - input.expect_span(), + input.span(), )), + span: command_span, }, }, Value::String { @@ -167,6 +169,7 @@ fn action( Some("consider using the `--binary` flag".to_owned()), Vec::new(), )), + span: *value_span, }, } } @@ -182,6 +185,7 @@ fn action( None, Vec::new(), )), + span: command_span, }, } } @@ -190,8 +194,9 @@ fn action( other => Value::Error { error: Box::new(ShellError::TypeMismatch { err_message: format!("string or binary, not {}", other.get_type()), - span: other.span().unwrap_or(command_span), + span: other.span(), }), + span: other.span(), }, } } diff --git a/crates/nu-command/src/strings/encode_decode/decode.rs b/crates/nu-command/src/strings/encode_decode/decode.rs index 1387261cd..f99042637 100644 --- a/crates/nu-command/src/strings/encode_decode/decode.rs +++ b/crates/nu-command/src/strings/encode_decode/decode.rs @@ -77,12 +77,12 @@ documentation link at https://docs.rs/encoding_rs/latest/encoding_rs/#statics"# PipelineData::Value(v, ..) => match v { Value::Binary { val: bytes, .. } => super::encoding::decode(head, encoding, &bytes) .map(|val| val.into_pipeline_data()), - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), _ => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "binary".into(), wrong_type: v.get_type().to_string(), dst_span: head, - src_span: v.expect_span(), + src_span: v.span(), }), }, // This should be more precise, but due to difficulties in getting spans diff --git a/crates/nu-command/src/strings/encode_decode/encode.rs b/crates/nu-command/src/strings/encode_decode/encode.rs index f475701c6..8e977165e 100644 --- a/crates/nu-command/src/strings/encode_decode/encode.rs +++ b/crates/nu-command/src/strings/encode_decode/encode.rs @@ -100,12 +100,12 @@ documentation link at https://docs.rs/encoding_rs/latest/encoding_rs/#statics"# super::encoding::encode(head, encoding, &s, span, ignore_errors) .map(|val| val.into_pipeline_data()) } - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), _ => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "string".into(), wrong_type: v.get_type().to_string(), dst_span: head, - src_span: v.expect_span(), + src_span: v.span(), }), }, // This should be more precise, but due to difficulties in getting spans diff --git a/crates/nu-command/src/strings/format/date.rs b/crates/nu-command/src/strings/format/date.rs index e14d895c2..6e4e05b2d 100644 --- a/crates/nu-command/src/strings/format/date.rs +++ b/crates/nu-command/src/strings/format/date.rs @@ -135,6 +135,7 @@ where err_message: "invalid format".to_string(), span, }), + span, }, } } @@ -155,6 +156,7 @@ fn format_helper(value: Value, formatter: &str, formatter_span: Span, head_span: value.debug_value(), head_span, )), + span: head_span, }, } } @@ -180,6 +182,7 @@ fn format_helper_rfc2822(value: Value, span: Span) -> Value { } _ => Value::Error { error: Box::new(ShellError::DatetimeParseError(value.debug_value(), span)), + span, }, } } diff --git a/crates/nu-command/src/strings/format/duration.rs b/crates/nu-command/src/strings/format/duration.rs index 38d1eccef..66e6c29ad 100644 --- a/crates/nu-command/src/strings/format/duration.rs +++ b/crates/nu-command/src/strings/format/duration.rs @@ -137,7 +137,10 @@ fn format_value_impl(val: &Value, arg: &Arguments, span: Span) -> Value { } } } - Err(e) => Value::Error { error: Box::new(e) }, + Err(e) => Value::Error { + error: Box::new(e), + span: *inner_span, + }, } } Value::Error { .. } => val.clone(), @@ -146,8 +149,9 @@ fn format_value_impl(val: &Value, arg: &Arguments, span: Span) -> Value { exp_input_type: "filesize".into(), wrong_type: val.get_type().to_string(), dst_span: span, - src_span: val.expect_span(), + src_span: val.span(), }), + span, }, } } diff --git a/crates/nu-command/src/strings/format/filesize.rs b/crates/nu-command/src/strings/format/filesize.rs index 0ad430c7a..ab0446724 100644 --- a/crates/nu-command/src/strings/format/filesize.rs +++ b/crates/nu-command/src/strings/format/filesize.rs @@ -115,8 +115,9 @@ fn format_value_impl(val: &Value, arg: &Arguments, span: Span) -> Value { exp_input_type: "filesize".into(), wrong_type: val.get_type().to_string(), dst_span: span, - src_span: val.expect_span(), + src_span: val.span(), }), + span, }, } } diff --git a/crates/nu-command/src/strings/parse.rs b/crates/nu-command/src/strings/parse.rs index 2a520f5e4..01affd492 100644 --- a/crates/nu-command/src/strings/parse.rs +++ b/crates/nu-command/src/strings/parse.rs @@ -186,7 +186,7 @@ fn operate( } }; - let v_span = v.span()?; + let v_span = v.span(); let record = columns .iter() .zip(captures.iter().skip(1)) @@ -203,7 +203,7 @@ fn operate( return Err(ShellError::PipelineMismatch { exp_input_type: "string".into(), dst_span: head, - src_span: v.span()?, + src_span: v.span(), }) } } @@ -346,14 +346,15 @@ impl Iterator for ParseStreamer { error: Box::new(ShellError::PipelineMismatch { exp_input_type: "string".into(), dst_span: self.span, - src_span: v.span().unwrap_or(self.span), + src_span: v.span(), }), + span: v.span(), }) }; let parsed = stream_helper( self.regex.clone(), - v.span().unwrap_or(self.span), + v.span(), s, self.columns.clone(), &mut self.excess, @@ -403,6 +404,7 @@ impl Iterator for ParseStreamerExternal { Some(Err(err)) => { return Some(Value::Error { error: Box::new(err), + span: self.span, }) } _ => return None, @@ -415,6 +417,7 @@ impl Iterator for ParseStreamerExternal { dst_span: self.span, src_span: self.span, }), + span: self.span, }) }; @@ -445,10 +448,11 @@ fn stream_helper( error: Box::new(ShellError::GenericError( "Error with regular expression captures".into(), e.to_string(), - None, - None, + Some(span), + Some(e.to_string()), Vec::new(), )), + span, }) } }; diff --git a/crates/nu-command/src/strings/size.rs b/crates/nu-command/src/strings/size.rs index c4dab8296..96562df45 100644 --- a/crates/nu-command/src/strings/size.rs +++ b/crates/nu-command/src/strings/size.rs @@ -122,9 +122,14 @@ fn size( input.map( move |v| { // First, obtain the span. If this fails, propagate the error that results. - let value_span = match v.span() { - Err(v) => return Value::Error { error: Box::new(v) }, - Ok(v) => v, + let value_span = match &v { + Value::Error { error, span } => { + return Value::Error { + error: error.clone(), + span: *span, + } + } + v => v.span(), }; // Now, check if it's a string. match v.as_string() { @@ -135,6 +140,7 @@ fn size( dst_span: span, src_span: value_span, }), + span, }, } }, diff --git a/crates/nu-command/src/strings/split/chars.rs b/crates/nu-command/src/strings/split/chars.rs index 6e6b64fbe..4f47667b4 100644 --- a/crates/nu-command/src/strings/split/chars.rs +++ b/crates/nu-command/src/strings/split/chars.rs @@ -118,8 +118,13 @@ fn split_chars( } fn split_chars_helper(v: &Value, name: Span, graphemes: bool) -> Value { - match v.span() { - Ok(v_span) => { + match v { + Value::Error { error, span } => Value::Error { + error: error.clone(), + span: *span, + }, + v => { + let v_span = v.span(); if let Ok(s) = v.as_string() { Value::List { vals: if graphemes { @@ -144,12 +149,10 @@ fn split_chars_helper(v: &Value, name: Span, graphemes: bool) -> Value { dst_span: name, src_span: v_span, }), + span: name, } } } - Err(error) => Value::Error { - error: Box::new(error), - }, } } diff --git a/crates/nu-command/src/strings/split/column.rs b/crates/nu-command/src/strings/split/column.rs index 3b95bbeea..0e89727c3 100644 --- a/crates/nu-command/src/strings/split/column.rs +++ b/crates/nu-command/src/strings/split/column.rs @@ -201,17 +201,24 @@ fn split_column_helper( } vec![Value::record(record, head)] } else { - match v.span() { - Ok(span) => vec![Value::Error { - error: Box::new(ShellError::PipelineMismatch { - exp_input_type: "string".into(), - dst_span: head, - src_span: span, - }), - }], - Err(error) => vec![Value::Error { - error: Box::new(error), - }], + match v { + Value::Error { error, .. } => { + vec![Value::Error { + error: Box::new(*error.clone()), + span: head, + }] + } + v => { + let span = v.span(); + vec![Value::Error { + error: Box::new(ShellError::PipelineMismatch { + exp_input_type: "string".into(), + dst_span: head, + src_span: span, + }), + span, + }] + } } } } diff --git a/crates/nu-command/src/strings/split/list.rs b/crates/nu-command/src/strings/split/list.rs index 7bfc4fb8a..428947de4 100644 --- a/crates/nu-command/src/strings/split/list.rs +++ b/crates/nu-command/src/strings/split/list.rs @@ -169,8 +169,8 @@ impl Matcher { "Error with regular expression".into(), err.to_string(), match lhs { - Value::Error { error: _ } => None, - _ => Some(lhs.expect_span()), + Value::Error { .. } => None, + _ => Some(lhs.span()), }, None, Vec::new(), diff --git a/crates/nu-command/src/strings/split/row.rs b/crates/nu-command/src/strings/split/row.rs index 8d2eaa9be..d22502072 100644 --- a/crates/nu-command/src/strings/split/row.rs +++ b/crates/nu-command/src/strings/split/row.rs @@ -146,8 +146,16 @@ fn split_row( } fn split_row_helper(v: &Value, regex: &Regex, max_split: Option, name: Span) -> Vec { - match v.span() { - Ok(v_span) => { + match v { + Value::Error { error, span } => { + vec![Value::Error { + error: Box::new(*error.clone()), + span: *span, + }] + } + v => { + let v_span = v.span(); + if let Ok(s) = v.as_string() { match max_split { Some(max_split) => regex @@ -166,12 +174,10 @@ fn split_row_helper(v: &Value, regex: &Regex, max_split: Option, name: Sp dst_span: name, src_span: v_span, }), + span: name, }] } } - Err(error) => vec![Value::Error { - error: Box::new(error), - }], } } diff --git a/crates/nu-command/src/strings/split/words.rs b/crates/nu-command/src/strings/split/words.rs index 5ec7b8865..4bc50b2d3 100644 --- a/crates/nu-command/src/strings/split/words.rs +++ b/crates/nu-command/src/strings/split/words.rs @@ -153,8 +153,13 @@ fn split_words_helper(v: &Value, word_length: Option, span: Span, graphem // Let's go with the unicode one in hopes that it works on more than just ascii characters let regex_replace = Regex::new(r"[^\p{L}\']").expect("regular expression error"); - match v.span() { - Ok(v_span) => { + match v { + Value::Error { error, span } => Value::Error { + error: Box::new(*error.clone()), + span: *span, + }, + v => { + let v_span = v.span(); if let Ok(s) = v.as_string() { // let splits = s.unicode_words(); // let words = trim_to_words(s); @@ -195,12 +200,10 @@ fn split_words_helper(v: &Value, word_length: Option, span: Span, graphem dst_span: span, src_span: v_span, }), + span, } } } - Err(error) => Value::Error { - error: Box::new(error), - }, } } diff --git a/crates/nu-command/src/strings/str_/case/capitalize.rs b/crates/nu-command/src/strings/str_/case/capitalize.rs index a5fcaf51a..e5c714de7 100644 --- a/crates/nu-command/src/strings/str_/case/capitalize.rs +++ b/crates/nu-command/src/strings/str_/case/capitalize.rs @@ -100,6 +100,7 @@ fn operate( if let Err(error) = r { return Value::Error { error: Box::new(error), + span: head, }; } } @@ -122,8 +123,9 @@ fn action(input: &Value, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/case/downcase.rs b/crates/nu-command/src/strings/str_/case/downcase.rs index fb5d01fb4..b054b1c3e 100644 --- a/crates/nu-command/src/strings/str_/case/downcase.rs +++ b/crates/nu-command/src/strings/str_/case/downcase.rs @@ -111,6 +111,7 @@ fn operate( if let Err(error) = r { return Value::Error { error: Box::new(error), + span: head, }; } } @@ -133,8 +134,9 @@ fn action(input: &Value, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/case/mod.rs b/crates/nu-command/src/strings/str_/case/mod.rs index 2aa35e981..c602a4c31 100644 --- a/crates/nu-command/src/strings/str_/case/mod.rs +++ b/crates/nu-command/src/strings/str_/case/mod.rs @@ -61,8 +61,9 @@ where exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/case/upcase.rs b/crates/nu-command/src/strings/str_/case/upcase.rs index ffb6e2486..a0b61a708 100644 --- a/crates/nu-command/src/strings/str_/case/upcase.rs +++ b/crates/nu-command/src/strings/str_/case/upcase.rs @@ -80,6 +80,7 @@ fn operate( if let Err(error) = r { return Value::Error { error: Box::new(error), + span: head, }; } } @@ -102,8 +103,9 @@ fn action(input: &Value, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/contains.rs b/crates/nu-command/src/strings/str_/contains.rs index 740fa4451..0e3b65bb7 100644 --- a/crates/nu-command/src/strings/str_/contains.rs +++ b/crates/nu-command/src/strings/str_/contains.rs @@ -187,8 +187,9 @@ fn action( exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/distance.rs b/crates/nu-command/src/strings/str_/distance.rs index 31d102a5f..a6cdc9d27 100644 --- a/crates/nu-command/src/strings/str_/distance.rs +++ b/crates/nu-command/src/strings/str_/distance.rs @@ -116,8 +116,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/ends_with.rs b/crates/nu-command/src/strings/str_/ends_with.rs index e3d8311bc..ba2d44609 100644 --- a/crates/nu-command/src/strings/str_/ends_with.rs +++ b/crates/nu-command/src/strings/str_/ends_with.rs @@ -110,8 +110,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/expand.rs b/crates/nu-command/src/strings/str_/expand.rs index 08e4bbe1e..1c8fed4bc 100644 --- a/crates/nu-command/src/strings/str_/expand.rs +++ b/crates/nu-command/src/strings/str_/expand.rs @@ -197,14 +197,11 @@ impl Command for SubCommand { let is_path = call.has_flag("path"); input.map( move |v| { - let value_span = match v.span() { - Err(v) => return Value::Error { error: Box::new(v) }, - Ok(v) => v, - }; + let value_span = v.span(); match v.as_string() { Ok(s) => { let contents = if is_path { s.replace('\\', "\\\\") } else { s }; - str_expand(&contents, span, v.expect_span()) + str_expand(&contents, span, v.span()) } Err(_) => Value::Error { error: Box::new(ShellError::PipelineMismatch { @@ -212,6 +209,7 @@ impl Command for SubCommand { dst_span: span, src_span: value_span, }), + span, }, } }, @@ -236,7 +234,9 @@ fn str_expand(contents: &str, span: Span, value_span: Span) -> Value { }, Err(e) => match e { bracoxide::ExpansionError::NumConversionFailed(s) => Value::Error { error: - Box::new(ShellError::GenericError("Number Conversion Failed".to_owned(), format!("Number conversion failed at {s}."), Some(value_span), Some("Expected number, found text. Range format is `{M..N}`, where M and N are numeric values representing the starting and ending limits.".to_owned()), vec![])) }, + Box::new(ShellError::GenericError("Number Conversion Failed".to_owned(), format!("Number conversion failed at {s}."), Some(value_span), Some("Expected number, found text. Range format is `{M..N}`, where M and N are numeric values representing the starting and ending limits.".to_owned()), vec![])), + span, + }, }, } }, @@ -255,12 +255,15 @@ fn str_expand(contents: &str, span: Span, value_span: Span) -> Value { ParsingError::ExtraOBra(s) => ShellError::GenericError("Extra Opening Brace".to_owned(), format!("Used extra opening brace at {s}."), Some(value_span), Some("To escape opening brace use backslash, e.g. `\\{`".to_owned()), vec![]), ParsingError::NothingInBraces(s) => ShellError::GenericError("Nothing In Braces".to_owned(), format!("Nothing found inside braces at {s}."), Some(value_span), Some("Please provide valid content within the braces. Additionally, you can safely remove it, not needed.".to_owned()), vec![]), } - ) } + ), + span, + } } }, Err(e) => match e { TokenizationError::EmptyContent => Value::Error { error: Box::new(ShellError::PipelineEmpty { dst_span: value_span }), + span: value_span, }, TokenizationError::FormatNotSupported => Value::Error { error: Box::new( @@ -270,10 +273,12 @@ fn str_expand(contents: &str, span: Span, value_span: Span) -> Value { Some(value_span), Some("In brace expansion syntax, it is important to have an equal number of opening (`{`) and closing (`}`) braces. Please ensure that you provide a balanced pair of braces in your brace expansion pattern.".to_owned()), vec![] - )) + )), + span: value_span, }, TokenizationError::NoBraces => Value::Error { - error: Box::new(ShellError::GenericError("No Braces".to_owned(), "At least one `{}` brace expansion expected.".to_owned(), Some(value_span), Some("Please, examine the examples.".to_owned()), vec![])) + error: Box::new(ShellError::GenericError("No Braces".to_owned(), "At least one `{}` brace expansion expected.".to_owned(), Some(value_span), Some("Please, examine the examples.".to_owned()), vec![])), + span: value_span, } }, } diff --git a/crates/nu-command/src/strings/str_/index_of.rs b/crates/nu-command/src/strings/str_/index_of.rs index 3b9f877b4..fd49b14ed 100644 --- a/crates/nu-command/src/strings/str_/index_of.rs +++ b/crates/nu-command/src/strings/str_/index_of.rs @@ -163,6 +163,7 @@ fn action( let err = processing_error("could not find `index-of`", head); return Value::Error { error: Box::new(err), + span: head, }; } } @@ -202,8 +203,9 @@ fn action( exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/join.rs b/crates/nu-command/src/strings/str_/join.rs index 15e998c94..561c908ac 100644 --- a/crates/nu-command/src/strings/str_/join.rs +++ b/crates/nu-command/src/strings/str_/join.rs @@ -55,7 +55,7 @@ impl Command for StrJoin { for value in input { match value { - Value::Error { error } => { + Value::Error { error, .. } => { return Err(*error); } value => { diff --git a/crates/nu-command/src/strings/str_/length.rs b/crates/nu-command/src/strings/str_/length.rs index 5f08a7dd7..ef1b07f8c 100644 --- a/crates/nu-command/src/strings/str_/length.rs +++ b/crates/nu-command/src/strings/str_/length.rs @@ -117,8 +117,9 @@ fn action(input: &Value, arg: &Arguments, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/replace.rs b/crates/nu-command/src/strings/str_/replace.rs index 8d42c6b25..b84a3c9b7 100644 --- a/crates/nu-command/src/strings/str_/replace.rs +++ b/crates/nu-command/src/strings/str_/replace.rs @@ -276,6 +276,7 @@ fn action( val_span: find.span, call_span: head, }), + span: find.span, }, } } @@ -286,8 +287,9 @@ fn action( exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/reverse.rs b/crates/nu-command/src/strings/str_/reverse.rs index f3fa11cb9..a05431e44 100644 --- a/crates/nu-command/src/strings/str_/reverse.rs +++ b/crates/nu-command/src/strings/str_/reverse.rs @@ -89,8 +89,9 @@ fn action(input: &Value, _arg: &CellPathOnlyArgs, head: Span) -> Value { exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/starts_with.rs b/crates/nu-command/src/strings/str_/starts_with.rs index 9a44551b9..21a4f5046 100644 --- a/crates/nu-command/src/strings/str_/starts_with.rs +++ b/crates/nu-command/src/strings/str_/starts_with.rs @@ -123,8 +123,9 @@ fn action( exp_input_type: "string".into(), wrong_type: input.get_type().to_string(), dst_span: head, - src_span: input.expect_span(), + src_span: input.span(), }), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/substring.rs b/crates/nu-command/src/strings/str_/substring.rs index c5ad1a640..22d353e3d 100644 --- a/crates/nu-command/src/strings/str_/substring.rs +++ b/crates/nu-command/src/strings/str_/substring.rs @@ -149,6 +149,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { err_message: "End must be greater than or equal to Start".to_string(), span: head, }), + span: head, }, Ordering::Less => Value::String { val: { @@ -195,8 +196,9 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { format!("input type: {:?}", other.get_type()), head, // This line requires the Value::Error match above. - other.expect_span(), + other.span(), )), + span: head, }, } } diff --git a/crates/nu-command/src/strings/str_/trim/trim_.rs b/crates/nu-command/src/strings/str_/trim/trim_.rs index 39b8ce920..7fdef6f03 100644 --- a/crates/nu-command/src/strings/str_/trim/trim_.rs +++ b/crates/nu-command/src/strings/str_/trim/trim_.rs @@ -208,8 +208,9 @@ fn action(input: &Value, arg: &Arguments, head: Span) -> Value { format!("input type: {:?}", other.get_type()), head, // This line requires the Value::Error match above. - other.expect_span(), + other.span(), )), + span: head, } } }, diff --git a/crates/nu-command/src/system/run_external.rs b/crates/nu-command/src/system/run_external.rs index f0726cef0..0aa045303 100644 --- a/crates/nu-command/src/system/run_external.rs +++ b/crates/nu-command/src/system/run_external.rs @@ -118,7 +118,7 @@ pub fn create_external_command( let env_vars_str = env_to_strings(engine_state, stack)?; fn value_as_spanned(value: Value) -> Result, ShellError> { - let span = value.span()?; + let span = value.span(); value .as_string() @@ -507,6 +507,7 @@ impl ExternalCommand { ); let _ = exit_code_tx.send(Value::Error { error: Box::new(ShellError::ExternalCommand { label: "core dumped".to_string(), help: format!("{cause}: child process '{commandname}' core dumped"), span: head }), + span: head, }); return Ok(()); } diff --git a/crates/nu-command/src/viewers/table.rs b/crates/nu-command/src/viewers/table.rs index bf0cc97d7..25d489a25 100644 --- a/crates/nu-command/src/viewers/table.rs +++ b/crates/nu-command/src/viewers/table.rs @@ -297,7 +297,7 @@ fn handle_table_command( term_width, ) } - PipelineData::Value(Value::Error { error }, ..) => { + PipelineData::Value(Value::Error { error, .. }, ..) => { // Propagate this error outward, so that it goes to stderr // instead of stdout. Err(*error) diff --git a/crates/nu-command/tests/commands/length.rs b/crates/nu-command/tests/commands/length.rs index 9cf073a72..63318e65d 100644 --- a/crates/nu-command/tests/commands/length.rs +++ b/crates/nu-command/tests/commands/length.rs @@ -18,5 +18,5 @@ fn length_columns_no_rows() { fn length_fails_on_echo_record() { let actual = nu!("echo {a:1 b:2} | length"); - assert_eq!(actual.err.contains("only_supports_this_input_type"), true); + assert!(actual.err.contains("only_supports_this_input_type")); } diff --git a/crates/nu-engine/src/env.rs b/crates/nu-engine/src/env.rs index fa5c49a39..bc2265d6e 100644 --- a/crates/nu-engine/src/env.rs +++ b/crates/nu-engine/src/env.rs @@ -18,6 +18,7 @@ const ENV_PATH_NAME: &str = "PATH"; const ENV_CONVERSIONS: &str = "ENV_CONVERSIONS"; +#[allow(dead_code)] enum ConversionResult { Ok(Value), ConversionError(ShellError), // Failure during the conversion itself @@ -116,19 +117,19 @@ pub fn env_to_string( Ok(p) => Ok(p.to_string_lossy().to_string()), Err(_) => Err(ShellError::EnvVarNotAString { envvar_name: env_name.to_string(), - span: value.span()?, + span: value.span(), }), } } _ => Err(ShellError::EnvVarNotAString { envvar_name: env_name.to_string(), - span: value.span()?, + span: value.span(), }), } } else { Err(ShellError::EnvVarNotAString { envvar_name: env_name.to_string(), - span: value.span()?, + span: value.span(), }) } } @@ -167,7 +168,7 @@ pub fn current_dir_str(engine_state: &EngineState, stack: &Stack) -> Result ConversionResult { if let Some(env_conversions) = stack.get_env_var(engine_state, ENV_CONVERSIONS) { - let env_span = match env_conversions.span() { - Ok(span) => span, - Err(e) => { - return ConversionResult::GeneralError(e); - } - }; - let val_span = match orig_val.span() { - Ok(span) => span, - Err(e) => { - return ConversionResult::GeneralError(e); - } - }; + let env_span = env_conversions.span(); + let val_span = orig_val.span(); let path_members = &[ PathMember::String { @@ -421,13 +412,7 @@ fn ensure_path(scope: &mut HashMap, env_path_name: &str) -> Optio } Some(val) => { // All other values are errors - let span = match val.span() { - Ok(sp) => sp, - Err(e) => { - error = error.or(Some(e)); - Span::unknown() // FIXME: any better span to use here? - } - }; + let span = val.span(); error = error.or_else(|| { Some(ShellError::GenericError( diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index 66485c926..bf2e4919c 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -93,7 +93,7 @@ pub fn eval_call( } let span = if let Some(rest_item) = rest_items.first() { - rest_item.span()? + rest_item.span() } else { call.head }; @@ -284,7 +284,7 @@ pub fn eval_expression( span: expr.span, }), Expr::ValueWithUnit(e, unit) => match eval_expression(engine_state, stack, e)? { - Value::Int { val, .. } => Ok(compute(val, unit.item, unit.span)), + Value::Int { val, .. } => compute(val, unit.item, unit.span), x => Err(ShellError::CantConvert { to_type: "unit value".into(), from_type: x.get_type().to_string(), @@ -1155,6 +1155,7 @@ pub fn eval_block( input = PipelineData::Value( Value::Error { error: Box::new(error), + span: Span::unknown(), // FIXME: where does this span come from? }, None, ) @@ -1247,7 +1248,10 @@ pub fn eval_nu_variable(engine_state: &EngineState, span: Span) -> Result Result Result Result Result Result Result Result Value { +fn compute(size: i64, unit: Unit, span: Span) -> Result { unit.to_value(size, span) } @@ -1461,6 +1475,7 @@ fn collect_profiling_metadata( Ok((PipelineData::Empty, ..)) => Value::Nothing { span: element_span }, Err(err) => Value::Error { error: Box::new(err.clone()), + span: element_span, }, }; diff --git a/crates/nu-explore/src/explore.rs b/crates/nu-explore/src/explore.rs index 398da3bde..23c40335f 100644 --- a/crates/nu-explore/src/explore.rs +++ b/crates/nu-explore/src/explore.rs @@ -100,6 +100,7 @@ impl Command for Explore { Err(err) => Ok(PipelineData::Value( Value::Error { error: Box::new(err.into()), + span: call.head, }, None, )), diff --git a/crates/nu-explore/src/nu_common/command.rs b/crates/nu-explore/src/nu_common/command.rs index f3875e1b5..53777d9b4 100644 --- a/crates/nu-explore/src/nu_common/command.rs +++ b/crates/nu-explore/src/nu_common/command.rs @@ -17,7 +17,7 @@ pub fn run_command_with_value( let pipeline = PipelineData::Value(input.clone(), None); let pipeline = run_nu_command(engine_state, stack, command, pipeline)?; - if let PipelineData::Value(Value::Error { error }, ..) = pipeline { + if let PipelineData::Value(Value::Error { error, .. }, ..) = pipeline { Err(ShellError::IOError(error.to_string())) } else { Ok(pipeline) diff --git a/crates/nu-explore/src/nu_common/value.rs b/crates/nu-explore/src/nu_common/value.rs index 1c880f3d8..12fb26595 100644 --- a/crates/nu-explore/src/nu_common/value.rs +++ b/crates/nu-explore/src/nu_common/value.rs @@ -56,6 +56,7 @@ fn collect_external_stream( let value = stdout.into_string().map_or_else( |error| Value::Error { error: Box::new(error), + span, }, |string| Value::string(string.item, span), ); @@ -67,6 +68,7 @@ fn collect_external_stream( let value = stderr.into_string().map_or_else( |error| Value::Error { error: Box::new(error), + span, }, |string| Value::string(string.item, span), ); diff --git a/crates/nu-parser/src/eval.rs b/crates/nu-parser/src/eval.rs index ae5495ece..bed158d41 100644 --- a/crates/nu-parser/src/eval.rs +++ b/crates/nu-parser/src/eval.rs @@ -112,7 +112,13 @@ pub fn eval_constant( Expr::Nothing => Ok(Value::Nothing { span: expr.span }), Expr::ValueWithUnit(expr, unit) => { if let Ok(Value::Int { val, .. }) = eval_constant(working_set, expr) { - Ok(unit.item.to_value(val, unit.span)) + unit.item.to_value(val, unit.span).map_err(|_| { + ParseError::InvalidLiteral( + "literal can not fit in unit".into(), + "literal can not fit in unit".into(), + unit.span, + ) + }) } else { Err(ParseError::NotAConstant(expr.span)) } diff --git a/crates/nu-protocol/src/config.rs b/crates/nu-protocol/src/config.rs index df1618307..4c09062a4 100644 --- a/crates/nu-protocol/src/config.rs +++ b/crates/nu-protocol/src/config.rs @@ -355,14 +355,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -388,14 +388,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -421,14 +421,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -498,14 +498,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -643,7 +643,7 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{key2}.{x} is an unknown config setting" ); } @@ -660,14 +660,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct record vals[index] = Value::record( record! { @@ -852,14 +852,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -1022,14 +1022,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -1068,14 +1068,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -1090,7 +1090,7 @@ impl Value { if let Ok(map) = create_map(value) { config.explore = map; } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( config @@ -1107,7 +1107,7 @@ impl Value { if let Ok(map) = create_map(value) { config.color_config = map; } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( config @@ -1304,14 +1304,14 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{key}.{x} is an unknown config setting" ); } } } } else { - invalid!(vals[index].span().ok(), "should be a record"); + invalid!(Some(vals[index].span()), "should be a record"); // Reconstruct vals[index] = Value::record( record! { @@ -1328,7 +1328,7 @@ impl Value { cols, vals, index, - value.span().ok(), + Some(value.span()), "$env.config.{x} is an unknown config setting" ); } @@ -1340,7 +1340,7 @@ impl Value { Some(ShellError::GenericError( "Error while applying config changes".into(), "$env.config is not a record".into(), - self.span().ok(), + Some(self.span()), None, vec![], )), @@ -1377,7 +1377,7 @@ fn try_parse_trim_strategy( ShellError::GenericError( "Error while applying config changes".into(), "$env.config.table.trim is not a record".into(), - value.span().ok(), + Some(value.span()), Some("Please consult the documentation for configuring Nushell.".into()), vec![e], ) @@ -1392,7 +1392,7 @@ fn try_parse_trim_strategy( errors.push(ShellError::GenericError( "Error while applying config changes".into(), "$env.config.table.trim.methodology was not provided".into(), - value.span().ok(), + Some(value.span()), Some("Please consult the documentation for configuring Nushell.".into()), vec![], )); @@ -1409,7 +1409,7 @@ fn try_parse_trim_strategy( errors.push(ShellError::GenericError( "Error while applying config changes".into(), "$env.config.table.trim.wrapping_try_keep_words is not a bool".into(), - value.span().ok(), + Some(value.span()), Some("Please consult the documentation for configuring Nushell.".into()), vec![], )); @@ -1424,7 +1424,7 @@ fn try_parse_trim_strategy( errors.push(ShellError::GenericError( "Error while applying config changes".into(), "$env.config.table.trim.truncating_suffix is not a string".into(), - value.span().ok(), + Some(value.span()), Some("Please consult the documentation for configuring Nushell.".into()), vec![], )); @@ -1491,7 +1491,7 @@ fn create_hooks(value: &Value) -> Result { v => Err(ShellError::UnsupportedConfigValue( "record for 'hooks' config".into(), "non-record value".into(), - v.span().unwrap_or_else(|_| Span::unknown()), + v.span(), )), } } diff --git a/crates/nu-protocol/src/engine/pattern_match.rs b/crates/nu-protocol/src/engine/pattern_match.rs index aef44d18c..307a6b2fb 100644 --- a/crates/nu-protocol/src/engine/pattern_match.rs +++ b/crates/nu-protocol/src/engine/pattern_match.rs @@ -148,7 +148,10 @@ impl Matcher for Pattern { let span = unit.span; if let Expr::Int(size) = amount.expr { - &unit.item.to_value(size, span) == value + match &unit.item.to_value(size, span) { + Ok(v) => v == value, + _ => false, + } } else { false } diff --git a/crates/nu-protocol/src/pipeline_data.rs b/crates/nu-protocol/src/pipeline_data.rs index 3e47d2efc..e127475e5 100644 --- a/crates/nu-protocol/src/pipeline_data.rs +++ b/crates/nu-protocol/src/pipeline_data.rs @@ -123,7 +123,7 @@ impl PipelineData { match self { PipelineData::ListStream(..) => None, PipelineData::ExternalStream { span, .. } => Some(*span), - PipelineData::Value(v, _) => v.span().ok(), + PipelineData::Value(v, _) => Some(v.span()), PipelineData::Empty => None, } } @@ -162,7 +162,10 @@ impl PipelineData { items.push(val); } Err(e) => { - return Value::Error { error: Box::new(e) }; + return Value::Error { + error: Box::new(e), + span, + }; } } } @@ -184,6 +187,7 @@ impl PipelineData { Err(err) => { return Value::Error { error: Box::new(err), + span, }; } } @@ -201,6 +205,7 @@ impl PipelineData { Err(err) => { return Value::Error { error: Box::new(err), + span, }; } } @@ -219,7 +224,7 @@ impl PipelineData { pub fn drain(self) -> Result<(), ShellError> { match self { - PipelineData::Value(Value::Error { error }, _) => Err(*error), + PipelineData::Value(Value::Error { error, .. }, _) => Err(*error), PipelineData::Value(_, _) => Ok(()), PipelineData::ListStream(stream, _) => stream.drain(), PipelineData::ExternalStream { stdout, stderr, .. } => { @@ -239,7 +244,7 @@ impl PipelineData { pub fn drain_with_exit_code(self) -> Result { match self { - PipelineData::Value(Value::Error { error }, _) => Err(*error), + PipelineData::Value(Value::Error { error, .. }, _) => Err(*error), PipelineData::Value(_, _) => Ok(0), PipelineData::ListStream(stream, _) => { stream.drain()?; @@ -301,12 +306,12 @@ impl PipelineData { Err(error) => Err(error), }, // Propagate errors by explicitly matching them before the final case. - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary, raw data or range".into(), wrong_type: other.get_type().to_string(), dst_span: span, - src_span: other.expect_span(), + src_span: other.span(), }), }, PipelineData::Empty => Err(ShellError::OnlySupportsThisInputType { @@ -366,7 +371,7 @@ impl PipelineData { PipelineData::Value(Value::String { val, span }, metadata) => Ok((val, span, metadata)), PipelineData::Value(val, _) => Err(ShellError::TypeMismatch { err_message: "string".into(), - span: val.span()?, + span: val.span(), }), PipelineData::ListStream(_, _) => Err(ShellError::TypeMismatch { err_message: "string".into(), @@ -470,7 +475,7 @@ impl PipelineData { .map(f) .into_pipeline_data(ctrlc)), PipelineData::Value(v, ..) => match f(v) { - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), v => Ok(v.into_pipeline_data()), }, } @@ -589,7 +594,7 @@ impl PipelineData { if f(&v) { Ok(v.into_pipeline_data()) } else { - Ok(Value::Nothing { span: v.span()? }.into_pipeline_data()) + Ok(Value::Nothing { span: v.span() }.into_pipeline_data()) } } } @@ -807,7 +812,7 @@ impl PipelineData { ) -> Result { for item in self { let mut is_err = false; - let mut out = if let Value::Error { error } = item { + let mut out = if let Value::Error { error, .. } = item { let working_set = StateWorkingSet::new(engine_state); // Value::Errors must always go to stderr, not stdout. is_err = true; @@ -851,7 +856,7 @@ impl IntoIterator for PipelineData { metadata, )) } - PipelineData::Value(Value::Range { val, .. }, metadata) => { + PipelineData::Value(Value::Range { val, span }, metadata) => { match val.into_range_iter(None) { Ok(iter) => PipelineIterator(PipelineData::ListStream( ListStream { @@ -864,6 +869,7 @@ impl IntoIterator for PipelineData { ListStream { stream: Box::new(std::iter::once(Value::Error { error: Box::new(error), + span, })), ctrlc: None, }, @@ -914,7 +920,7 @@ fn drain_exit_code(exit_code: ListStream) -> Result { let mut exit_codes: Vec<_> = exit_code.into_iter().collect(); match exit_codes.pop() { #[cfg(unix)] - Some(Value::Error { error }) => Err(*error), + Some(Value::Error { error, .. }) => Err(*error), Some(Value::Int { val, .. }) => Ok(val), _ => Ok(0), } @@ -937,6 +943,7 @@ impl Iterator for PipelineIterator { Ok(x) => x, Err(err) => Value::Error { error: Box::new(err), + span: Span::unknown(), //FIXME: unclear where this span should come from }, }), } diff --git a/crates/nu-protocol/src/value/from.rs b/crates/nu-protocol/src/value/from.rs index a8b994e82..9519f5815 100644 --- a/crates/nu-protocol/src/value/from.rs +++ b/crates/nu-protocol/src/value/from.rs @@ -7,7 +7,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "f64".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -21,7 +21,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "i64".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } diff --git a/crates/nu-protocol/src/value/from_value.rs b/crates/nu-protocol/src/value/from_value.rs index 48a08d119..6759efb39 100644 --- a/crates/nu-protocol/src/value/from_value.rs +++ b/crates/nu-protocol/src/value/from_value.rs @@ -36,7 +36,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "integer".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -53,7 +53,7 @@ impl FromValue for i64 { v => Err(ShellError::CantConvert { to_type: "integer".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -75,7 +75,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "float".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -90,7 +90,7 @@ impl FromValue for f64 { v => Err(ShellError::CantConvert { to_type: "float".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -134,7 +134,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "non-negative integer".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -169,7 +169,7 @@ impl FromValue for usize { v => Err(ShellError::CantConvert { to_type: "non-negative integer".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -185,7 +185,7 @@ impl FromValue for String { v => Err(ShellError::CantConvert { to_type: "string".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -202,12 +202,12 @@ impl FromValue for Spanned { return Err(ShellError::CantConvert { to_type: "string".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }) } }, - span: v.span()?, + span: v.span(), }) } } @@ -223,7 +223,7 @@ impl FromValue for Vec { c => Err(ShellError::CantConvert { to_type: "string".into(), from_type: c.get_type().to_string(), - span: c.span()?, + span: c.span(), help: None, }), }) @@ -231,7 +231,7 @@ impl FromValue for Vec { v => Err(ShellError::CantConvert { to_type: "string".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -252,7 +252,7 @@ impl FromValue for Vec> { c => Err(ShellError::CantConvert { to_type: "string".into(), from_type: c.get_type().to_string(), - span: c.span()?, + span: c.span(), help: None, }), }) @@ -260,7 +260,7 @@ impl FromValue for Vec> { v => Err(ShellError::CantConvert { to_type: "string".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -277,7 +277,7 @@ impl FromValue for Vec { c => Err(ShellError::CantConvert { to_type: "bool".into(), from_type: c.get_type().to_string(), - span: c.span()?, + span: c.span(), help: None, }), }) @@ -285,7 +285,7 @@ impl FromValue for Vec { v => Err(ShellError::CantConvert { to_type: "bool".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -294,7 +294,7 @@ impl FromValue for Vec { impl FromValue for CellPath { fn from_value(v: &Value) -> Result { - let span = v.span()?; + let span = v.span(); match v { Value::CellPath { val, .. } => Ok(val.clone()), Value::String { val, .. } => Ok(CellPath { @@ -334,7 +334,7 @@ impl FromValue for bool { v => Err(ShellError::CantConvert { to_type: "bool".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -351,7 +351,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "bool".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -365,7 +365,7 @@ impl FromValue for DateTime { v => Err(ShellError::CantConvert { to_type: "date".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -382,7 +382,7 @@ impl FromValue for Spanned> { v => Err(ShellError::CantConvert { to_type: "date".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -396,7 +396,7 @@ impl FromValue for Range { v => Err(ShellError::CantConvert { to_type: "range".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -413,7 +413,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "range".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -428,7 +428,7 @@ impl FromValue for Vec { v => Err(ShellError::CantConvert { to_type: "binary data".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -449,7 +449,7 @@ impl FromValue for Spanned> { v => Err(ShellError::CantConvert { to_type: "binary data".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -467,7 +467,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "range".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -482,7 +482,7 @@ impl FromValue for Vec { v => Err(ShellError::CantConvert { to_type: "Vector of values".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -496,7 +496,7 @@ impl FromValue for Record { v => Err(ShellError::CantConvert { to_type: "Record".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -517,7 +517,7 @@ impl FromValue for Closure { v => Err(ShellError::CantConvert { to_type: "Closure".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -531,7 +531,7 @@ impl FromValue for Block { v => Err(ShellError::CantConvert { to_type: "Block".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -555,7 +555,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "Closure".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -572,7 +572,7 @@ impl FromValue for Spanned { v => Err(ShellError::CantConvert { to_type: "Match pattern".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } @@ -586,7 +586,7 @@ impl FromValue for MatchPattern { v => Err(ShellError::CantConvert { to_type: "Match pattern".into(), from_type: v.get_type().to_string(), - span: v.span()?, + span: v.span(), help: None, }), } diff --git a/crates/nu-protocol/src/value/mod.rs b/crates/nu-protocol/src/value/mod.rs index 3db34049c..5ffd13ce8 100644 --- a/crates/nu-protocol/src/value/mod.rs +++ b/crates/nu-protocol/src/value/mod.rs @@ -96,6 +96,7 @@ pub enum Value { }, Error { error: Box, + span: Span, }, Binary { val: Vec, @@ -170,8 +171,9 @@ impl Clone for Value { span: *span, }, Value::Nothing { span } => Value::Nothing { span: *span }, - Value::Error { error } => Value::Error { + Value::Error { error, span } => Value::Error { error: error.clone(), + span: *span, }, Value::Binary { val, span } => Value::Binary { val: val.clone(), @@ -197,7 +199,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "boolean".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -209,7 +211,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "integer".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -222,7 +224,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "float".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -234,7 +236,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "filesize".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -246,7 +248,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "duration".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -258,7 +260,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "date".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -270,7 +272,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "range".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -288,7 +290,7 @@ impl Value { return Err(ShellError::CantConvert { to_type: "string".into(), from_type: "binary".into(), - span: self.span()?, + span: self.span(), help: None, }); } @@ -297,7 +299,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "string".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -318,7 +320,7 @@ impl Value { return Err(ShellError::CantConvert { to_type: "string".into(), from_type: "binary".into(), - span: self.span()?, + span: self.span(), help: None, }) } @@ -326,7 +328,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "string".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -347,7 +349,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "char".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -359,7 +361,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "path".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -371,7 +373,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "record".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -383,7 +385,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "list".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -396,7 +398,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "block".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -408,7 +410,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "closure".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -421,7 +423,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "binary".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -433,7 +435,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "cell path".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -445,7 +447,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "custom value".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -457,7 +459,7 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "lazy record".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } @@ -469,14 +471,14 @@ impl Value { x => Err(ShellError::CantConvert { to_type: "match pattern".into(), from_type: x.get_type().to_string(), - span: self.span()?, + span: self.span(), help: None, }), } } /// Get the span for the current value - pub fn span(&self) -> Result { + pub fn span(&self) -> Span { match self { Value::Bool { span, .. } | Value::Int { span, .. } @@ -495,18 +497,11 @@ impl Value { | Value::CellPath { span, .. } | Value::CustomValue { span, .. } | Value::LazyRecord { span, .. } - | Value::MatchPattern { span, .. } => Ok(*span), - Value::Error { error } => Err(*error.clone()), + | Value::MatchPattern { span, .. } + | Value::Error { span, .. } => *span, } } - /// Special variant of the above designed to be called only in - /// situations where the value not being a Value::Error has been guaranteed - /// by match arms. - pub fn expect_span(&self) -> Span { - self.span().expect("non-Error Value had no span") - } - /// Update the value with a new span pub fn with_span(mut self, new_span: Span) -> Value { match &mut self { @@ -625,7 +620,7 @@ impl Value { separator: &str, config: &Config, ) -> Result { - if let Value::Error { error } = self { + if let Value::Error { error, .. } = self { Err(*error.to_owned()) } else { Ok(self.into_string(separator, config)) @@ -677,11 +672,12 @@ impl Value { .collect::>() .join(separator) ), - Value::LazyRecord { val, .. } => { + Value::LazyRecord { val, span } => { let collected = match val.collect() { Ok(val) => val, Err(error) => Value::Error { error: Box::new(error), + span: *span, }, }; collected.into_string(separator, config) @@ -689,7 +685,7 @@ impl Value { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), @@ -744,7 +740,7 @@ impl Value { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), @@ -844,7 +840,7 @@ impl Value { Value::Block { val, .. } => format!(""), Value::Closure { val, .. } => format!(""), Value::Nothing { .. } => String::new(), - Value::Error { error } => format!("{error:?}"), + Value::Error { error, .. } => format!("{error:?}"), Value::Binary { val, .. } => format!("{val:?}"), Value::CellPath { val, .. } => val.into_string(), Value::CustomValue { val, .. } => val.value_string(), @@ -868,6 +864,10 @@ impl Value { matches!(self, Value::Nothing { .. }) } + pub fn is_error(&self) -> bool { + matches!(self, Value::Error { .. }) + } + /// Follow a given cell path into the value: for example accessing select elements in a stream or list pub fn follow_cell_path( self, @@ -961,7 +961,7 @@ impl Value { span: *origin_span, }) } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), x => { return Err(ShellError::IncompatiblePathAccess { type_name:format!("{}",x.get_type()), span: *origin_span }) } @@ -1041,7 +1041,7 @@ impl Value { return Err(ShellError::CantFindColumn { col_name: column_name.to_string(), span: *origin_span, - src_span: val.span().unwrap_or(*span), + src_span: val.span(), }); } } else if *optional && matches!(val, Value::Nothing { .. }) { @@ -1050,7 +1050,7 @@ impl Value { return Err(ShellError::CantFindColumn { col_name: column_name.to_string(), span: *origin_span, - src_span: val.span().unwrap_or(*span), + src_span: val.span(), }); } } @@ -1066,7 +1066,7 @@ impl Value { Value::Nothing { .. } if *optional => { return Ok(Value::nothing(*origin_span)); // short-circuit } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), x => { return Err(ShellError::IncompatiblePathAccess { type_name: format!("{}", x.get_type()), @@ -1078,7 +1078,7 @@ impl Value { } // If a single Value::Error was produced by the above (which won't happen if nullify_errors is true), unwrap it now. // Note that Value::Errors inside Lists remain as they are, so that the rest of the list can still potentially be used. - if let Value::Error { error } = current { + if let Value::Error { error, .. } = current { Err(*error) } else { Ok(current) @@ -1096,7 +1096,7 @@ impl Value { let new_val = callback(&orig.follow_cell_path(cell_path, false)?); match new_val { - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), new_val => self.upsert_data_at_cell_path(cell_path, new_val), } } @@ -1133,7 +1133,7 @@ impl Value { break; } else { let mut new_col = - Value::record(Record::new(), new_val.span()?); + Value::record(Record::new(), new_val.span()); new_col.upsert_data_at_cell_path( &cell_path[1..], new_val, @@ -1143,12 +1143,12 @@ impl Value { } } } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } } @@ -1167,7 +1167,7 @@ impl Value { let new_col = if cell_path.len() == 1 { new_val } else { - let mut new_col = Value::record(Record::new(), new_val.span()?); + let mut new_col = Value::record(Record::new(), new_val.span()); new_col.upsert_data_at_cell_path(&cell_path[1..], new_val)?; new_col }; @@ -1181,12 +1181,12 @@ impl Value { record.upsert_data_at_cell_path(cell_path, new_val)?; *self = record } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } }, @@ -1207,11 +1207,11 @@ impl Value { }); } } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::NotAList { dst_span: *span, - src_span: v.span()?, + src_span: v.span(), }) } }, @@ -1234,7 +1234,7 @@ impl Value { let new_val = callback(&orig.follow_cell_path(cell_path, false)?); match new_val { - Value::Error { error } => Err(*error), + Value::Error { error, .. } => Err(*error), new_val => self.update_data_at_cell_path(cell_path, new_val), } @@ -1277,12 +1277,12 @@ impl Value { }); } } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } } @@ -1314,12 +1314,12 @@ impl Value { record.update_data_at_cell_path(cell_path, new_val)?; *self = record } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } }, @@ -1338,11 +1338,11 @@ impl Value { }); } } - Value::Error { error } => return Err(*error.to_owned()), + Value::Error { error, .. } => return Err(*error.to_owned()), v => { return Err(ShellError::NotAList { dst_span: *span, - src_span: v.span()?, + src_span: v.span(), }) } }, @@ -1396,7 +1396,7 @@ impl Value { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } } @@ -1438,7 +1438,7 @@ impl Value { v => Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }), }, PathMember::Int { @@ -1463,7 +1463,7 @@ impl Value { } v => Err(ShellError::NotAList { dst_span: *span, - src_span: v.span()?, + src_span: v.span(), }), }, } @@ -1502,7 +1502,7 @@ impl Value { return Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }) } } @@ -1540,7 +1540,7 @@ impl Value { v => Err(ShellError::CantFindColumn { col_name: col_name.to_string(), span: *span, - src_span: v.span()?, + src_span: v.span(), }), }, PathMember::Int { @@ -1564,7 +1564,7 @@ impl Value { } v => Err(ShellError::NotAList { dst_span: *span, - src_span: v.span()?, + src_span: v.span(), }), }, } @@ -1613,7 +1613,7 @@ impl Value { record.push(col_name, new_val.clone()); } // SIGH... - Value::Error { error } => return Err(*error.clone()), + Value::Error { error, .. } => return Err(*error.clone()), _ => { return Err(ShellError::UnsupportedInput( "expected table or record".into(), @@ -1684,7 +1684,7 @@ impl Value { v => { return Err(ShellError::NotAList { dst_span: *span, - src_span: v.span()?, + src_span: v.span(), }) } }, @@ -1774,9 +1774,10 @@ impl Value { Value::Nothing { span } } - pub fn error(error: ShellError) -> Value { + pub fn error(error: ShellError, span: Span) -> Value { Value::Error { error: Box::new(error), + span, } } @@ -2399,9 +2400,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2436,9 +2437,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2517,9 +2518,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2627,9 +2628,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2764,9 +2765,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2900,9 +2901,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -2923,9 +2924,9 @@ impl Value { return Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }); } @@ -2938,9 +2939,9 @@ impl Value { Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }) } } @@ -2966,9 +2967,9 @@ impl Value { return Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }); } @@ -2980,9 +2981,9 @@ impl Value { .ok_or(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }) } @@ -3007,9 +3008,9 @@ impl Value { return Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }); } @@ -3021,9 +3022,9 @@ impl Value { .ok_or(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }) } @@ -3048,9 +3049,9 @@ impl Value { return Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }); } @@ -3062,9 +3063,9 @@ impl Value { None => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3087,9 +3088,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3113,9 +3114,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3171,9 +3172,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3228,9 +3229,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3304,9 +3305,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3323,9 +3324,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3342,9 +3343,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3361,9 +3362,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3380,9 +3381,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3399,9 +3400,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3418,9 +3419,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3437,9 +3438,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3493,9 +3494,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3512,9 +3513,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3531,9 +3532,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3550,9 +3551,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } @@ -3585,9 +3586,9 @@ impl Value { _ => Err(ShellError::OperatorMismatch { op_span: op, lhs_ty: self.get_type().to_string(), - lhs_span: self.span()?, + lhs_span: self.span(), rhs_ty: rhs.get_type().to_string(), - rhs_span: rhs.span()?, + rhs_span: rhs.span(), }), } } diff --git a/crates/nu-protocol/src/value/range.rs b/crates/nu-protocol/src/value/range.rs index 0f4526722..e09f4f1b0 100644 --- a/crates/nu-protocol/src/value/range.rs +++ b/crates/nu-protocol/src/value/range.rs @@ -130,7 +130,7 @@ impl Range { self, ctrlc: Option>, ) -> Result { - let span = self.from.span()?; + let span = self.from.span(); Ok(RangeIterator::new(self, ctrlc, span)) } @@ -217,6 +217,7 @@ impl Iterator for RangeIterator { self.done = true; return Some(Value::Error { error: Box::new(ShellError::CannotCreateRange { span: self.span }), + span: self.span, }); }; @@ -237,6 +238,7 @@ impl Iterator for RangeIterator { self.done = true; return Some(Value::Error { error: Box::new(error), + span: self.span, }); } }; diff --git a/crates/nu-protocol/src/value/stream.rs b/crates/nu-protocol/src/value/stream.rs index 47bdfb750..b812ef908 100644 --- a/crates/nu-protocol/src/value/stream.rs +++ b/crates/nu-protocol/src/value/stream.rs @@ -76,7 +76,7 @@ impl RawStream { for next in self { match next { Ok(val) => { - if let Value::Error { error } = val { + if let Value::Error { error, .. } = val { return Err(*error); } } @@ -213,7 +213,7 @@ impl ListStream { pub fn drain(self) -> Result<(), ShellError> { for next in self { - if let Value::Error { error } = next { + if let Value::Error { error, .. } = next { return Err(*error); } } diff --git a/crates/nu-protocol/src/value/unit.rs b/crates/nu-protocol/src/value/unit.rs index 31c2c48ab..6587d9b8e 100644 --- a/crates/nu-protocol/src/value/unit.rs +++ b/crates/nu-protocol/src/value/unit.rs @@ -32,119 +32,111 @@ pub enum Unit { } impl Unit { - pub fn to_value(&self, size: i64, span: Span) -> Value { + pub fn to_value(&self, size: i64, span: Span) -> Result { match self { - Unit::Byte => Value::Filesize { val: size, span }, - Unit::Kilobyte => Value::Filesize { + Unit::Byte => Ok(Value::Filesize { val: size, span }), + Unit::Kilobyte => Ok(Value::Filesize { val: size * 1000, span, - }, - Unit::Megabyte => Value::Filesize { + }), + Unit::Megabyte => Ok(Value::Filesize { val: size * 1000 * 1000, span, - }, - Unit::Gigabyte => Value::Filesize { + }), + Unit::Gigabyte => Ok(Value::Filesize { val: size * 1000 * 1000 * 1000, span, - }, - Unit::Terabyte => Value::Filesize { + }), + Unit::Terabyte => Ok(Value::Filesize { val: size * 1000 * 1000 * 1000 * 1000, span, - }, - Unit::Petabyte => Value::Filesize { + }), + Unit::Petabyte => Ok(Value::Filesize { val: size * 1000 * 1000 * 1000 * 1000 * 1000, span, - }, - Unit::Exabyte => Value::Filesize { + }), + Unit::Exabyte => Ok(Value::Filesize { val: size * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, span, - }, + }), - Unit::Kibibyte => Value::Filesize { + Unit::Kibibyte => Ok(Value::Filesize { val: size * 1024, span, - }, - Unit::Mebibyte => Value::Filesize { + }), + Unit::Mebibyte => Ok(Value::Filesize { val: size * 1024 * 1024, span, - }, - Unit::Gibibyte => Value::Filesize { + }), + Unit::Gibibyte => Ok(Value::Filesize { val: size * 1024 * 1024 * 1024, span, - }, - Unit::Tebibyte => Value::Filesize { + }), + Unit::Tebibyte => Ok(Value::Filesize { val: size * 1024 * 1024 * 1024 * 1024, span, - }, - Unit::Pebibyte => Value::Filesize { + }), + Unit::Pebibyte => Ok(Value::Filesize { val: size * 1024 * 1024 * 1024 * 1024 * 1024, span, - }, - Unit::Exbibyte => Value::Filesize { + }), + Unit::Exbibyte => Ok(Value::Filesize { val: size * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, span, - }, + }), - Unit::Nanosecond => Value::Duration { val: size, span }, - Unit::Microsecond => Value::Duration { + Unit::Nanosecond => Ok(Value::Duration { val: size, span }), + Unit::Microsecond => Ok(Value::Duration { val: size * 1000, span, - }, - Unit::Millisecond => Value::Duration { + }), + Unit::Millisecond => Ok(Value::Duration { val: size * 1000 * 1000, span, - }, - Unit::Second => Value::Duration { + }), + Unit::Second => Ok(Value::Duration { val: size * 1000 * 1000 * 1000, span, - }, + }), Unit::Minute => match size.checked_mul(1000 * 1000 * 1000 * 60) { - Some(val) => Value::Duration { val, span }, - None => Value::Error { - error: Box::new(ShellError::GenericError( - "duration too large".into(), - "duration too large".into(), - Some(span), - None, - Vec::new(), - )), - }, + Some(val) => Ok(Value::Duration { val, span }), + None => Err(ShellError::GenericError( + "duration too large".into(), + "duration too large".into(), + Some(span), + None, + Vec::new(), + )), }, Unit::Hour => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60) { - Some(val) => Value::Duration { val, span }, - None => Value::Error { - error: Box::new(ShellError::GenericError( - "duration too large".into(), - "duration too large".into(), - Some(span), - None, - Vec::new(), - )), - }, + Some(val) => Ok(Value::Duration { val, span }), + None => Err(ShellError::GenericError( + "duration too large".into(), + "duration too large".into(), + Some(span), + None, + Vec::new(), + )), }, Unit::Day => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60 * 24) { - Some(val) => Value::Duration { val, span }, - None => Value::Error { - error: Box::new(ShellError::GenericError( - "duration too large".into(), - "duration too large".into(), - Some(span), - None, - Vec::new(), - )), - }, + Some(val) => Ok(Value::Duration { val, span }), + None => Err(ShellError::GenericError( + "duration too large".into(), + "duration too large".into(), + Some(span), + None, + Vec::new(), + )), }, Unit::Week => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60 * 24 * 7) { - Some(val) => Value::Duration { val, span }, - None => Value::Error { - error: Box::new(ShellError::GenericError( - "duration too large".into(), - "duration too large".into(), - Some(span), - None, - Vec::new(), - )), - }, + Some(val) => Ok(Value::Duration { val, span }), + None => Err(ShellError::GenericError( + "duration too large".into(), + "duration too large".into(), + Some(span), + None, + Vec::new(), + )), }, } } diff --git a/crates/nu-protocol/tests/test_value.rs b/crates/nu-protocol/tests/test_value.rs index 28faa4b1b..91a72b05e 100644 --- a/crates/nu-protocol/tests/test_value.rs +++ b/crates/nu-protocol/tests/test_value.rs @@ -38,7 +38,7 @@ fn test_comparison_nothing() { #[rstest] #[case(365 * 24 * 3600 * 1_000_000_000, "52wk 1day")] -#[case( ((((((((1 * 7) + 2) * 24 + 3) * 60 + 4) * 60) + 5) * 1000 + 6) * 1000 + 7) * 1000 + 8, +#[case( (((((((7 + 2) * 24 + 3) * 60 + 4) * 60) + 5) * 1000 + 6) * 1000 + 7) * 1000 + 8, "1wk 2day 3hr 4min 5sec 6ms 7µs 8ns")] fn test_duration_to_string(#[case] in_ns: i64, #[case] expected: &str) { let dur = Value::test_duration(in_ns); diff --git a/crates/nu-table/src/types/collapse.rs b/crates/nu-table/src/types/collapse.rs index 2ab2eadd7..968246013 100644 --- a/crates/nu-table/src/types/collapse.rs +++ b/crates/nu-table/src/types/collapse.rs @@ -1,5 +1,5 @@ use nu_color_config::StyleComputer; -use nu_protocol::{Config, Span, Value}; +use nu_protocol::{Config, Value}; use crate::UnstructuredTable; @@ -61,7 +61,7 @@ fn colorize_value(value: &mut Value, config: &Config, style_computer: &StyleComp let (text, style) = nu_value_to_string_clean(value, config, style_computer); if let Some(color) = style.color_style { let text = color.paint(text).to_string(); - let span = value.span().unwrap_or(Span::unknown()); + let span = value.span(); *value = Value::string(text, span); } } diff --git a/crates/nu-table/src/types/expanded.rs b/crates/nu-table/src/types/expanded.rs index 597b42ef0..5916ef1b3 100644 --- a/crates/nu-table/src/types/expanded.rs +++ b/crates/nu-table/src/types/expanded.rs @@ -110,7 +110,7 @@ fn expanded_table_list(input: &[Value], cfg: Cfg<'_>) -> TableResult { return Ok(None); } - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { return Err(*error.clone()); } @@ -150,7 +150,7 @@ fn expanded_table_list(input: &[Value], cfg: Cfg<'_>) -> TableResult { return Ok(None); } - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { return Err(*error.clone()); } @@ -238,7 +238,7 @@ fn expanded_table_list(input: &[Value], cfg: Cfg<'_>) -> TableResult { return Ok(None); } - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { return Err(*error.clone()); } diff --git a/crates/nu-table/src/types/general.rs b/crates/nu-table/src/types/general.rs index 7f9195f6a..6114e03bb 100644 --- a/crates/nu-table/src/types/general.rs +++ b/crates/nu-table/src/types/general.rs @@ -130,7 +130,7 @@ fn to_table_with_header( return Ok(None); } - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { return Err(*error.clone()); } @@ -165,7 +165,7 @@ fn to_table_with_no_header( return Ok(None); } - if let Value::Error { error } = item { + if let Value::Error { error, .. } = item { return Err(*error.clone()); } diff --git a/crates/nu_plugin_custom_values/src/cool_custom_value.rs b/crates/nu_plugin_custom_values/src/cool_custom_value.rs index 900b69338..757e6c0b8 100644 --- a/crates/nu_plugin_custom_values/src/cool_custom_value.rs +++ b/crates/nu_plugin_custom_values/src/cool_custom_value.rs @@ -37,7 +37,7 @@ impl CoolCustomValue { x => Err(ShellError::CantConvert { to_type: "cool".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu_plugin_custom_values/src/second_custom_value.rs b/crates/nu_plugin_custom_values/src/second_custom_value.rs index 617e78f3a..48eff6d0e 100644 --- a/crates/nu_plugin_custom_values/src/second_custom_value.rs +++ b/crates/nu_plugin_custom_values/src/second_custom_value.rs @@ -34,7 +34,7 @@ impl SecondCustomValue { x => Err(ShellError::CantConvert { to_type: "cool".into(), from_type: x.get_type().to_string(), - span: x.span()?, + span: x.span(), help: None, }), } diff --git a/crates/nu_plugin_formats/src/from/ics.rs b/crates/nu_plugin_formats/src/from/ics.rs index 97babe222..fef400c3b 100644 --- a/crates/nu_plugin_formats/src/from/ics.rs +++ b/crates/nu_plugin_formats/src/from/ics.rs @@ -8,7 +8,7 @@ use std::io::BufReader; pub const CMD_NAME: &str = "from ics"; pub fn from_ics_call(call: &EvaluatedCall, input: &Value) -> Result { - let span = input.span().unwrap_or(call.head); + let span = input.span(); let input_string = input.as_string()?; let head = call.head; @@ -34,6 +34,7 @@ pub fn from_ics_call(call: &EvaluatedCall, input: &Value) -> Result Result { - let span = input.span().unwrap_or(call.head); + let span = input.span(); let input_string = input.as_string()?; let head = call.head; diff --git a/crates/nu_plugin_formats/src/from/vcf.rs b/crates/nu_plugin_formats/src/from/vcf.rs index e8ddcec7e..8f3bdb6b3 100644 --- a/crates/nu_plugin_formats/src/from/vcf.rs +++ b/crates/nu_plugin_formats/src/from/vcf.rs @@ -7,7 +7,7 @@ use nu_protocol::{record, PluginExample, Record, ShellError, Span, Value}; pub const CMD_NAME: &str = "from vcf"; pub fn from_vcf_call(call: &EvaluatedCall, input: &Value) -> Result { - let span = input.span().unwrap_or(call.head); + let span = input.span(); let input_string = input.as_string()?; let head = call.head; @@ -30,6 +30,7 @@ pub fn from_vcf_call(call: &EvaluatedCall, input: &Value) -> Result Result Err(LabeledError { label: "requires text input".to_string(), msg: "Expected text from pipeline".to_string(), - span: Some(input.span()?), + span: Some(input.span()), }), } }