Move Value to helpers, separate span call (#10121)

# Description

As part of the refactor to split spans off of Value, this moves to using
helper functions to create values, and using `.span()` instead of
matching span out of Value directly.

Hoping to get a few more helping hands to finish this, as there are a
lot of commands to update :)

# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->

# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use std testing; testing run-tests --path
crates/nu-std"` to run the tests for the standard library

> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->

# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->

---------

Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
Co-authored-by: WindSoilder <windsoilder@outlook.com>
This commit is contained in:
JT
2023-09-04 02:27:29 +12:00
committed by GitHub
parent af79eb2943
commit 6cdfee3573
372 changed files with 5811 additions and 7448 deletions

View File

@ -58,15 +58,15 @@ fn date(
) -> Result<PipelineData, ShellError> {
let head = call.head;
Ok(Value::String {
val: get_full_help(
Ok(Value::string(
get_full_help(
&Date.signature(),
&Date.examples(),
engine_state,
stack,
false,
),
span: head,
}
head,
)
.into_pipeline_data())
}

View File

@ -64,35 +64,24 @@ impl Command for SubCommand {
}
fn helper(value: Value, head: Span) -> Value {
let span = value.span();
match value {
Value::Nothing { span: _ } => {
Value::Nothing { .. } => {
let dt = Local::now();
Value::String {
val: humanize_date(dt.with_timezone(dt.offset())),
span: head,
}
Value::string(humanize_date(dt.with_timezone(dt.offset())), head)
}
Value::String {
val,
span: val_span,
} => {
let dt = parse_date_from_string(&val, val_span);
Value::String { val, .. } => {
let dt = parse_date_from_string(&val, span);
match dt {
Ok(x) => Value::String {
val: humanize_date(x),
span: head,
},
Ok(x) => Value::string(humanize_date(x), head),
Err(e) => e,
}
}
Value::Date { val, span: _ } => Value::String {
val: humanize_date(val),
span: head,
},
_ => Value::Error {
error: Box::new(ShellError::DatetimeParseError(value.debug_value(), head)),
span: head,
},
Value::Date { val, .. } => Value::string(humanize_date(val), head),
_ => Value::error(
ShellError::DatetimeParseError(value.debug_value(), head),
head,
),
}
}

View File

@ -52,13 +52,13 @@ impl Command for SubCommand {
vec![Example {
example: "date list-timezone | where timezone =~ Shanghai",
description: "Show timezone(s) that contains 'Shanghai'",
result: Some(Value::List {
vals: vec![Value::test_record(Record {
result: Some(Value::list(
vec![Value::test_record(Record {
cols: vec!["timezone".into()],
vals: vec![Value::test_string("Asia/Shanghai")],
})],
span: Span::test_data(),
}),
Span::test_data(),
)),
}]
}
}

View File

@ -35,11 +35,7 @@ impl Command for SubCommand {
) -> Result<PipelineData, ShellError> {
let head = call.head;
let dt = Local::now();
Ok(Value::Date {
val: dt.with_timezone(dt.offset()),
span: head,
}
.into_pipeline_data())
Ok(Value::date(dt.with_timezone(dt.offset()), head).into_pipeline_data())
}
fn examples(&self) -> Vec<Example> {

View File

@ -62,20 +62,14 @@ impl Command for SubCommand {
"timezone".into(),
];
let vals = vec![
Value::Int { val: 2020, span },
Value::Int { val: 4, span },
Value::Int { val: 12, span },
Value::Int { val: 22, span },
Value::Int { val: 10, span },
Value::Int { val: 57, span },
Value::Int {
val: 123_000_000,
span,
},
Value::String {
val: "+02:00".to_string(),
span,
},
Value::int(2020, span),
Value::int(4, span),
Value::int(12, span),
Value::int(22, span),
Value::int(10, span),
Value::int(57, span),
Value::int(123_000_000, span),
Value::string("+02:00", span),
];
Some(Value::test_record(Record { cols, vals }))
};
@ -93,17 +87,14 @@ impl Command for SubCommand {
"timezone".into(),
];
let vals = vec![
Value::Int { val: 2020, span },
Value::Int { val: 4, span },
Value::Int { val: 12, span },
Value::Int { val: 22, span },
Value::Int { val: 10, span },
Value::Int { val: 57, span },
Value::Int { val: 0, span },
Value::String {
val: "+02:00".to_string(),
span,
},
Value::int(2020, span),
Value::int(4, span),
Value::int(12, span),
Value::int(22, span),
Value::int(10, span),
Value::int(57, span),
Value::int(0, span),
Value::string("+02:00", span),
];
Some(Value::test_record(Record { cols, vals }))
};
@ -150,24 +141,19 @@ fn parse_date_into_table(date: DateTime<FixedOffset>, head: Span) -> Value {
}
fn helper(val: Value, head: Span) -> Value {
let span = val.span();
match val {
Value::String {
val,
span: val_span,
} => match parse_date_from_string(&val, val_span) {
Value::String { val, .. } => match parse_date_from_string(&val, span) {
Ok(date) => parse_date_into_table(date, head),
Err(e) => e,
},
Value::Nothing { span: _ } => {
Value::Nothing { .. } => {
let now = Local::now();
let n = now.with_timezone(now.offset());
parse_date_into_table(n, head)
}
Value::Date { val, span: _ } => parse_date_into_table(val, head),
_ => Value::Error {
error: Box::new(DatetimeParseError(val.debug_value(), head)),
span: head,
},
Value::Date { val, .. } => parse_date_into_table(val, head),
_ => Value::error(DatetimeParseError(val.debug_value(), head), head),
}
}

View File

@ -62,22 +62,19 @@ impl Command for SubCommand {
"timezone".into(),
];
let vals = vec![
Value::Int { val: 2020, span },
Value::Int { val: 4, span },
Value::Int { val: 12, span },
Value::Int { val: 22, span },
Value::Int { val: 10, span },
Value::Int { val: 57, span },
Value::Int { val: 789, span },
Value::String {
val: "+02:00".to_string(),
span,
},
Value::int(2020, span),
Value::int(4, span),
Value::int(12, span),
Value::int(22, span),
Value::int(10, span),
Value::int(57, span),
Value::int(789, span),
Value::string("+02:00".to_string(), span),
];
Some(Value::List {
vals: vec![Value::test_record(Record { cols, vals })],
Some(Value::list(
vec![Value::test_record(Record { cols, vals })],
span,
})
))
};
let example_result_2 = || {
@ -93,22 +90,19 @@ impl Command for SubCommand {
"timezone".into(),
];
let vals = vec![
Value::Int { val: 2020, span },
Value::Int { val: 4, span },
Value::Int { val: 12, span },
Value::Int { val: 22, span },
Value::Int { val: 10, span },
Value::Int { val: 57, span },
Value::Int { val: 0, span },
Value::String {
val: "+02:00".to_string(),
span,
},
Value::int(2020, span),
Value::int(4, span),
Value::int(12, span),
Value::int(22, span),
Value::int(10, span),
Value::int(57, span),
Value::int(0, span),
Value::string("+02:00".to_string(), span),
];
Some(Value::List {
vals: vec![Value::test_record(Record { cols, vals })],
Some(Value::list(
vec![Value::test_record(Record { cols, vals })],
span,
})
))
};
vec![
@ -152,24 +146,19 @@ fn parse_date_into_table(date: DateTime<FixedOffset>, head: Span) -> Value {
}
fn helper(val: Value, head: Span) -> Value {
let val_span = val.span();
match val {
Value::String {
val,
span: val_span,
} => match parse_date_from_string(&val, val_span) {
Value::String { val, .. } => match parse_date_from_string(&val, val_span) {
Ok(date) => parse_date_into_table(date, head),
Err(e) => e,
},
Value::Nothing { span: _ } => {
Value::Nothing { .. } => {
let now = Local::now();
let n = now.with_timezone(now.offset());
parse_date_into_table(n, head)
}
Value::Date { val, span: _ } => parse_date_into_table(val, head),
_ => Value::Error {
error: Box::new(DatetimeParseError(val.debug_value(), head)),
span: head,
},
Value::Date { val, .. } => parse_date_into_table(val, head),
_ => Value::error(DatetimeParseError(val.debug_value(), head), head),
}
}

View File

@ -71,10 +71,7 @@ impl Command for SubCommand {
.expect("to timezone: help example is invalid")
.with_ymd_and_hms(2020, 10, 10, 13, 00, 00)
{
LocalResult::Single(dt) => Some(Value::Date {
val: dt,
span: Span::test_data(),
}),
LocalResult::Single(dt) => Some(Value::date(dt, Span::test_data())),
_ => panic!("to timezone: help example is invalid"),
};
@ -109,12 +106,10 @@ impl Command for SubCommand {
}
fn helper(value: Value, head: Span, timezone: &Spanned<String>) -> Value {
let val_span = value.span();
match value {
Value::Date { val, span: _ } => _to_timezone(val, timezone, head),
Value::String {
val,
span: val_span,
} => {
Value::Date { val, .. } => _to_timezone(val, timezone, head),
Value::String { val, .. } => {
let time = parse_date_from_string(&val, val_span);
match time {
Ok(dt) => _to_timezone(dt, timezone, head),
@ -122,27 +117,27 @@ fn helper(value: Value, head: Span, timezone: &Spanned<String>) -> Value {
}
}
Value::Nothing { span: _ } => {
Value::Nothing { .. } => {
let dt = Local::now();
_to_timezone(dt.with_timezone(dt.offset()), timezone, head)
}
_ => Value::Error {
error: Box::new(ShellError::DatetimeParseError(value.debug_value(), head)),
span: head,
},
_ => Value::error(
ShellError::DatetimeParseError(value.debug_value(), head),
head,
),
}
}
fn _to_timezone(dt: DateTime<FixedOffset>, timezone: &Spanned<String>, span: Span) -> Value {
match datetime_in_timezone(&dt, timezone.item.as_str()) {
Ok(dt) => Value::Date { val: dt, span },
Err(_) => Value::Error {
error: Box::new(ShellError::TypeMismatch {
Ok(dt) => Value::date(dt, span),
Err(_) => Value::error(
ShellError::TypeMismatch {
err_message: String::from("invalid time zone"),
span: timezone.span,
}),
span: timezone.span,
},
},
timezone.span,
),
}
}

View File

@ -14,16 +14,16 @@ pub(crate) fn parse_date_from_string(
match offset.from_local_datetime(&native_dt) {
LocalResult::Single(d) => Ok(d),
LocalResult::Ambiguous(d, _) => Ok(d),
LocalResult::None => Err(Value::Error {
error: Box::new(ShellError::DatetimeParseError(input.to_string(), span)),
LocalResult::None => Err(Value::error(
ShellError::DatetimeParseError(input.to_string(), span),
span,
}),
)),
}
}
Err(_) => Err(Value::Error {
error: Box::new(ShellError::DatetimeParseError(input.to_string(), span)),
Err(_) => Err(Value::error(
ShellError::DatetimeParseError(input.to_string(), span),
span,
}),
)),
}
}
@ -289,8 +289,5 @@ pub(crate) fn generate_strftime_list(head: Span, show_parse_only_formats: bool)
));
}
Value::List {
vals: records,
span: head,
}
Value::list(records, head)
}