From 47f6d20131a21aca2ccf61edef17e9e8ff400a26 Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Thu, 7 Jul 2022 18:54:38 +0800 Subject: [PATCH] adds better error for failed string-to-duration conversions (#5977) * adds better error for failed string-to-duration conversions * makes error multi-spanned, conveys literally all the information available now --- .../nu-command/src/conversions/into/duration.rs | 11 ++++++++--- crates/nu-protocol/src/shell_error.rs | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/crates/nu-command/src/conversions/into/duration.rs b/crates/nu-command/src/conversions/into/duration.rs index a7386c297..1c5ef6e6a 100644 --- a/crates/nu-command/src/conversions/into/duration.rs +++ b/crates/nu-command/src/conversions/into/duration.rs @@ -136,7 +136,7 @@ fn into_duration( ) } -fn string_to_duration(s: &str, span: Span) -> Result { +fn string_to_duration(s: &str, span: Span, value_span: Span) -> Result { if let Some(expression) = parse_duration_bytes(s.as_bytes(), span) { if let Expr::ValueWithUnit(value, unit) = expression.expr { if let Expr::Int(x) = value.expr { @@ -155,10 +155,12 @@ fn string_to_duration(s: &str, span: Span) -> Result { } } - Err(ShellError::CantConvert( + Err(ShellError::CantConvertWithValue( "duration".to_string(), "string".to_string(), + s.to_string(), span, + value_span, Some("supported units are ns, us, ms, sec, min, hr, day, and wk".to_string()), )) } @@ -166,7 +168,10 @@ fn string_to_duration(s: &str, span: Span) -> Result { fn action(input: &Value, span: Span) -> Value { match input { Value::Duration { .. } => input.clone(), - Value::String { val, .. } => match string_to_duration(val, span) { + Value::String { + val, + span: value_span, + } => match string_to_duration(val, span, *value_span) { Ok(val) => Value::Duration { val, span }, Err(error) => Value::Error { error }, }, diff --git a/crates/nu-protocol/src/shell_error.rs b/crates/nu-protocol/src/shell_error.rs index 91ef77f65..160da9a2f 100644 --- a/crates/nu-protocol/src/shell_error.rs +++ b/crates/nu-protocol/src/shell_error.rs @@ -269,6 +269,22 @@ pub enum ShellError { #[help] Option, ), + /// Failed to convert a value of one type into a different type. Includes hint for what the first value is. + /// + /// ## Resolution + /// + /// Not all values can be coerced this way. Check the supported type(s) and try again. + #[error("Can't convert {1} `{2}` to {0}.")] + #[diagnostic(code(nu::shell::cant_convert_with_value), url(docsrs))] + CantConvertWithValue( + String, + String, + String, + #[label("can't be converted to {0}")] Span, + #[label("this {1} value...")] Span, + #[help] Option, + ), + /// An environment variable cannot be represented as a string. /// /// ## Resolution