mirror of
https://github.com/nushell/nushell.git
synced 2025-08-10 02:57:53 +02:00
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:
@ -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())
|
||||
}
|
||||
|
@ -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,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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(),
|
||||
)),
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
@ -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> {
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user