diff --git a/crates/nu-command/src/conversions/into/duration.rs b/crates/nu-command/src/conversions/into/duration.rs index a7386c2974..1c5ef6e6a1 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 91ef77f655..160da9a2fd 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