From 12660d01a0483a98bf41a9019bcae672f7e6d3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Riegel?= Date: Sun, 30 Mar 2025 14:38:37 +0200 Subject: [PATCH] Spanned to allow for more precise error --- .../src/conversions/into/datetime.rs | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/crates/nu-command/src/conversions/into/datetime.rs b/crates/nu-command/src/conversions/into/datetime.rs index 0b67fd0aee..fa38d5f781 100644 --- a/crates/nu-command/src/conversions/into/datetime.rs +++ b/crates/nu-command/src/conversions/into/datetime.rs @@ -19,7 +19,7 @@ const ALLOWED_COLUMNS: [&str; 10] = [ #[derive(Clone, Debug)] struct Arguments { zone_options: Option>, - format_options: Option, + format_options: Option>, cell_paths: Option>, } @@ -144,13 +144,16 @@ impl Command for IntoDatetime { }; let format_options = call - .get_flag::(engine_state, stack, "format")? + .get_flag::>(engine_state, stack, "format")? .as_ref() - .map(|fmt| DatetimeFormat(fmt.to_string())); + .map(|fmt| Spanned { + item: DatetimeFormat(fmt.item.to_string()), + span: fmt.span, + }); let args = Arguments { - format_options, zone_options, + format_options, cell_paths, }; operate(action, args, input, call.head, engine_state.signals()) @@ -670,21 +673,20 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { } } - // TODO - // match dateformat { - // None => (), - // Some(_) => { - // return Value::error( - // ShellError::IncompatibleParameters { - // left_message: "got a record as input".into(), - // left_span: head, - // right_message:"cannot be used with records".into(), - // right_span: input.span(), - // }, - // head, - // ); - // } - // } + match dateformat { + None => (), + Some(dt) => { + return Value::error( + ShellError::IncompatibleParameters { + left_message: "got a record as input".into(), + left_span: head, + right_message: "cannot be used with records".into(), + right_span: dt.span, + }, + head, + ); + } + } dbg!(input); return merge_record(record, head, *internal_span); @@ -780,7 +782,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { let parse_as_string = |val: &str| { match dateformat { - Some(dt_format) => match DateTime::parse_from_str(val, &dt_format.0) { + Some(dt_format) => match DateTime::parse_from_str(val, &dt_format.item.0) { Ok(dt) => { match timezone { None => { @@ -829,7 +831,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { } }, Err(reason) => { - match NaiveDateTime::parse_from_str(val, &dt_format.0) { + match NaiveDateTime::parse_from_str(val, &dt_format.item.0) { Ok(d) => { let dt_fixed = Local.from_local_datetime(&d).single().unwrap_or_default(); @@ -838,7 +840,7 @@ fn action(input: &Value, args: &Arguments, head: Span) -> Value { } Err(_) => { Value::error ( - ShellError::CantConvert { to_type: format!("could not parse as datetime using format '{}'", dt_format.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()) }, + ShellError::CantConvert { to_type: format!("could not parse as datetime using format '{}'", dt_format.item.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()) }, head, ) }