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
This commit is contained in:
pwygab 2022-07-07 18:54:38 +08:00 committed by GitHub
parent e0b4ab09eb
commit 47f6d20131
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 3 deletions

View file

@ -136,7 +136,7 @@ fn into_duration(
)
}
fn string_to_duration(s: &str, span: Span) -> Result<i64, ShellError> {
fn string_to_duration(s: &str, span: Span, value_span: Span) -> Result<i64, ShellError> {
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<i64, ShellError> {
}
}
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<i64, ShellError> {
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 },
},

View file

@ -269,6 +269,22 @@ pub enum ShellError {
#[help] Option<String>,
),
/// 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<String>,
),
/// An environment variable cannot be represented as a string.
///
/// ## Resolution