forked from extern/nushell
Spanned Value step 1: span all value cases (#10042)
# Description This doesn't really do much that the user could see, but it helps get us ready to do the steps of the refactor to split the span off of Value, so that values can be spanless. This allows us to have top-level values that can hold both a Value and a Span, without requiring that all values have them. We expect to see significant memory reduction by removing so many unnecessary spans from values. For example, a table of 100,000 rows and 5 columns would have a savings of ~8megs in just spans that are almost always duplicated. # User-Facing Changes Nothing yet # 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 -A clippy::needless_collect -A clippy::result_large_err` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass - `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. -->
This commit is contained in:
@ -355,14 +355,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -388,14 +388,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -421,14 +421,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -498,14 +498,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -643,7 +643,7 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{key2}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
@ -660,14 +660,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct record
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -852,14 +852,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -1022,14 +1022,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -1068,14 +1068,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -1090,7 +1090,7 @@ impl Value {
|
||||
if let Ok(map) = create_map(value) {
|
||||
config.explore = map;
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
config
|
||||
@ -1107,7 +1107,7 @@ impl Value {
|
||||
if let Ok(map) = create_map(value) {
|
||||
config.color_config = map;
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
config
|
||||
@ -1304,14 +1304,14 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{key}.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
invalid!(vals[index].span().ok(), "should be a record");
|
||||
invalid!(Some(vals[index].span()), "should be a record");
|
||||
// Reconstruct
|
||||
vals[index] = Value::record(
|
||||
record! {
|
||||
@ -1328,7 +1328,7 @@ impl Value {
|
||||
cols,
|
||||
vals,
|
||||
index,
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
"$env.config.{x} is an unknown config setting"
|
||||
);
|
||||
}
|
||||
@ -1340,7 +1340,7 @@ impl Value {
|
||||
Some(ShellError::GenericError(
|
||||
"Error while applying config changes".into(),
|
||||
"$env.config is not a record".into(),
|
||||
self.span().ok(),
|
||||
Some(self.span()),
|
||||
None,
|
||||
vec![],
|
||||
)),
|
||||
@ -1377,7 +1377,7 @@ fn try_parse_trim_strategy(
|
||||
ShellError::GenericError(
|
||||
"Error while applying config changes".into(),
|
||||
"$env.config.table.trim is not a record".into(),
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
Some("Please consult the documentation for configuring Nushell.".into()),
|
||||
vec![e],
|
||||
)
|
||||
@ -1392,7 +1392,7 @@ fn try_parse_trim_strategy(
|
||||
errors.push(ShellError::GenericError(
|
||||
"Error while applying config changes".into(),
|
||||
"$env.config.table.trim.methodology was not provided".into(),
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
Some("Please consult the documentation for configuring Nushell.".into()),
|
||||
vec![],
|
||||
));
|
||||
@ -1409,7 +1409,7 @@ fn try_parse_trim_strategy(
|
||||
errors.push(ShellError::GenericError(
|
||||
"Error while applying config changes".into(),
|
||||
"$env.config.table.trim.wrapping_try_keep_words is not a bool".into(),
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
Some("Please consult the documentation for configuring Nushell.".into()),
|
||||
vec![],
|
||||
));
|
||||
@ -1424,7 +1424,7 @@ fn try_parse_trim_strategy(
|
||||
errors.push(ShellError::GenericError(
|
||||
"Error while applying config changes".into(),
|
||||
"$env.config.table.trim.truncating_suffix is not a string".into(),
|
||||
value.span().ok(),
|
||||
Some(value.span()),
|
||||
Some("Please consult the documentation for configuring Nushell.".into()),
|
||||
vec![],
|
||||
));
|
||||
@ -1491,7 +1491,7 @@ fn create_hooks(value: &Value) -> Result<Hooks, ShellError> {
|
||||
v => Err(ShellError::UnsupportedConfigValue(
|
||||
"record for 'hooks' config".into(),
|
||||
"non-record value".into(),
|
||||
v.span().unwrap_or_else(|_| Span::unknown()),
|
||||
v.span(),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
@ -148,7 +148,10 @@ impl Matcher for Pattern {
|
||||
let span = unit.span;
|
||||
|
||||
if let Expr::Int(size) = amount.expr {
|
||||
&unit.item.to_value(size, span) == value
|
||||
match &unit.item.to_value(size, span) {
|
||||
Ok(v) => v == value,
|
||||
_ => false,
|
||||
}
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ impl PipelineData {
|
||||
match self {
|
||||
PipelineData::ListStream(..) => None,
|
||||
PipelineData::ExternalStream { span, .. } => Some(*span),
|
||||
PipelineData::Value(v, _) => v.span().ok(),
|
||||
PipelineData::Value(v, _) => Some(v.span()),
|
||||
PipelineData::Empty => None,
|
||||
}
|
||||
}
|
||||
@ -162,7 +162,10 @@ impl PipelineData {
|
||||
items.push(val);
|
||||
}
|
||||
Err(e) => {
|
||||
return Value::Error { error: Box::new(e) };
|
||||
return Value::Error {
|
||||
error: Box::new(e),
|
||||
span,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -184,6 +187,7 @@ impl PipelineData {
|
||||
Err(err) => {
|
||||
return Value::Error {
|
||||
error: Box::new(err),
|
||||
span,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -201,6 +205,7 @@ impl PipelineData {
|
||||
Err(err) => {
|
||||
return Value::Error {
|
||||
error: Box::new(err),
|
||||
span,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -219,7 +224,7 @@ impl PipelineData {
|
||||
|
||||
pub fn drain(self) -> Result<(), ShellError> {
|
||||
match self {
|
||||
PipelineData::Value(Value::Error { error }, _) => Err(*error),
|
||||
PipelineData::Value(Value::Error { error, .. }, _) => Err(*error),
|
||||
PipelineData::Value(_, _) => Ok(()),
|
||||
PipelineData::ListStream(stream, _) => stream.drain(),
|
||||
PipelineData::ExternalStream { stdout, stderr, .. } => {
|
||||
@ -239,7 +244,7 @@ impl PipelineData {
|
||||
|
||||
pub fn drain_with_exit_code(self) -> Result<i64, ShellError> {
|
||||
match self {
|
||||
PipelineData::Value(Value::Error { error }, _) => Err(*error),
|
||||
PipelineData::Value(Value::Error { error, .. }, _) => Err(*error),
|
||||
PipelineData::Value(_, _) => Ok(0),
|
||||
PipelineData::ListStream(stream, _) => {
|
||||
stream.drain()?;
|
||||
@ -301,12 +306,12 @@ impl PipelineData {
|
||||
Err(error) => Err(error),
|
||||
},
|
||||
// Propagate errors by explicitly matching them before the final case.
|
||||
Value::Error { error } => Err(*error),
|
||||
Value::Error { error, .. } => Err(*error),
|
||||
other => Err(ShellError::OnlySupportsThisInputType {
|
||||
exp_input_type: "list, binary, raw data or range".into(),
|
||||
wrong_type: other.get_type().to_string(),
|
||||
dst_span: span,
|
||||
src_span: other.expect_span(),
|
||||
src_span: other.span(),
|
||||
}),
|
||||
},
|
||||
PipelineData::Empty => Err(ShellError::OnlySupportsThisInputType {
|
||||
@ -366,7 +371,7 @@ impl PipelineData {
|
||||
PipelineData::Value(Value::String { val, span }, metadata) => Ok((val, span, metadata)),
|
||||
PipelineData::Value(val, _) => Err(ShellError::TypeMismatch {
|
||||
err_message: "string".into(),
|
||||
span: val.span()?,
|
||||
span: val.span(),
|
||||
}),
|
||||
PipelineData::ListStream(_, _) => Err(ShellError::TypeMismatch {
|
||||
err_message: "string".into(),
|
||||
@ -470,7 +475,7 @@ impl PipelineData {
|
||||
.map(f)
|
||||
.into_pipeline_data(ctrlc)),
|
||||
PipelineData::Value(v, ..) => match f(v) {
|
||||
Value::Error { error } => Err(*error),
|
||||
Value::Error { error, .. } => Err(*error),
|
||||
v => Ok(v.into_pipeline_data()),
|
||||
},
|
||||
}
|
||||
@ -589,7 +594,7 @@ impl PipelineData {
|
||||
if f(&v) {
|
||||
Ok(v.into_pipeline_data())
|
||||
} else {
|
||||
Ok(Value::Nothing { span: v.span()? }.into_pipeline_data())
|
||||
Ok(Value::Nothing { span: v.span() }.into_pipeline_data())
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -807,7 +812,7 @@ impl PipelineData {
|
||||
) -> Result<i64, ShellError> {
|
||||
for item in self {
|
||||
let mut is_err = false;
|
||||
let mut out = if let Value::Error { error } = item {
|
||||
let mut out = if let Value::Error { error, .. } = item {
|
||||
let working_set = StateWorkingSet::new(engine_state);
|
||||
// Value::Errors must always go to stderr, not stdout.
|
||||
is_err = true;
|
||||
@ -851,7 +856,7 @@ impl IntoIterator for PipelineData {
|
||||
metadata,
|
||||
))
|
||||
}
|
||||
PipelineData::Value(Value::Range { val, .. }, metadata) => {
|
||||
PipelineData::Value(Value::Range { val, span }, metadata) => {
|
||||
match val.into_range_iter(None) {
|
||||
Ok(iter) => PipelineIterator(PipelineData::ListStream(
|
||||
ListStream {
|
||||
@ -864,6 +869,7 @@ impl IntoIterator for PipelineData {
|
||||
ListStream {
|
||||
stream: Box::new(std::iter::once(Value::Error {
|
||||
error: Box::new(error),
|
||||
span,
|
||||
})),
|
||||
ctrlc: None,
|
||||
},
|
||||
@ -914,7 +920,7 @@ fn drain_exit_code(exit_code: ListStream) -> Result<i64, ShellError> {
|
||||
let mut exit_codes: Vec<_> = exit_code.into_iter().collect();
|
||||
match exit_codes.pop() {
|
||||
#[cfg(unix)]
|
||||
Some(Value::Error { error }) => Err(*error),
|
||||
Some(Value::Error { error, .. }) => Err(*error),
|
||||
Some(Value::Int { val, .. }) => Ok(val),
|
||||
_ => Ok(0),
|
||||
}
|
||||
@ -937,6 +943,7 @@ impl Iterator for PipelineIterator {
|
||||
Ok(x) => x,
|
||||
Err(err) => Value::Error {
|
||||
error: Box::new(err),
|
||||
span: Span::unknown(), //FIXME: unclear where this span should come from
|
||||
},
|
||||
}),
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "f64".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -21,7 +21,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "i64".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ impl FromValue for Spanned<i64> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -53,7 +53,7 @@ impl FromValue for i64 {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -75,7 +75,7 @@ impl FromValue for Spanned<f64> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -90,7 +90,7 @@ impl FromValue for f64 {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -134,7 +134,7 @@ impl FromValue for Spanned<usize> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "non-negative integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -169,7 +169,7 @@ impl FromValue for usize {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "non-negative integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -185,7 +185,7 @@ impl FromValue for String {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -202,12 +202,12 @@ impl FromValue for Spanned<String> {
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
})
|
||||
}
|
||||
},
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -223,7 +223,7 @@ impl FromValue for Vec<String> {
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
span: c.span(),
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
@ -231,7 +231,7 @@ impl FromValue for Vec<String> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -252,7 +252,7 @@ impl FromValue for Vec<Spanned<String>> {
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
span: c.span(),
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
@ -260,7 +260,7 @@ impl FromValue for Vec<Spanned<String>> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -277,7 +277,7 @@ impl FromValue for Vec<bool> {
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
span: c.span(),
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
@ -285,7 +285,7 @@ impl FromValue for Vec<bool> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -294,7 +294,7 @@ impl FromValue for Vec<bool> {
|
||||
|
||||
impl FromValue for CellPath {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
let span = v.span()?;
|
||||
let span = v.span();
|
||||
match v {
|
||||
Value::CellPath { val, .. } => Ok(val.clone()),
|
||||
Value::String { val, .. } => Ok(CellPath {
|
||||
@ -334,7 +334,7 @@ impl FromValue for bool {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -351,7 +351,7 @@ impl FromValue for Spanned<bool> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -365,7 +365,7 @@ impl FromValue for DateTime<FixedOffset> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "date".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -382,7 +382,7 @@ impl FromValue for Spanned<DateTime<FixedOffset>> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "date".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -396,7 +396,7 @@ impl FromValue for Range {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -413,7 +413,7 @@ impl FromValue for Spanned<Range> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -428,7 +428,7 @@ impl FromValue for Vec<u8> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "binary data".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -449,7 +449,7 @@ impl FromValue for Spanned<Vec<u8>> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "binary data".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -467,7 +467,7 @@ impl FromValue for Spanned<PathBuf> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -482,7 +482,7 @@ impl FromValue for Vec<Value> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Vector of values".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -496,7 +496,7 @@ impl FromValue for Record {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Record".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -517,7 +517,7 @@ impl FromValue for Closure {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Closure".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -531,7 +531,7 @@ impl FromValue for Block {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Block".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -555,7 +555,7 @@ impl FromValue for Spanned<Closure> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Closure".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -572,7 +572,7 @@ impl FromValue for Spanned<MatchPattern> {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Match pattern".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -586,7 +586,7 @@ impl FromValue for MatchPattern {
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Match pattern".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
span: v.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
|
@ -96,6 +96,7 @@ pub enum Value {
|
||||
},
|
||||
Error {
|
||||
error: Box<ShellError>,
|
||||
span: Span,
|
||||
},
|
||||
Binary {
|
||||
val: Vec<u8>,
|
||||
@ -170,8 +171,9 @@ impl Clone for Value {
|
||||
span: *span,
|
||||
},
|
||||
Value::Nothing { span } => Value::Nothing { span: *span },
|
||||
Value::Error { error } => Value::Error {
|
||||
Value::Error { error, span } => Value::Error {
|
||||
error: error.clone(),
|
||||
span: *span,
|
||||
},
|
||||
Value::Binary { val, span } => Value::Binary {
|
||||
val: val.clone(),
|
||||
@ -197,7 +199,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "boolean".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -209,7 +211,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -222,7 +224,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -234,7 +236,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "filesize".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -246,7 +248,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "duration".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -258,7 +260,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "date".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -270,7 +272,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -288,7 +290,7 @@ impl Value {
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: "binary".into(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
});
|
||||
}
|
||||
@ -297,7 +299,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -318,7 +320,7 @@ impl Value {
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: "binary".into(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
})
|
||||
}
|
||||
@ -326,7 +328,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -347,7 +349,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "char".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -359,7 +361,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "path".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -371,7 +373,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "record".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -383,7 +385,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "list".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -396,7 +398,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "block".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -408,7 +410,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "closure".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -421,7 +423,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "binary".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -433,7 +435,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "cell path".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -445,7 +447,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "custom value".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -457,7 +459,7 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "lazy record".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
@ -469,14 +471,14 @@ impl Value {
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "match pattern".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
span: self.span(),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the span for the current value
|
||||
pub fn span(&self) -> Result<Span, ShellError> {
|
||||
pub fn span(&self) -> Span {
|
||||
match self {
|
||||
Value::Bool { span, .. }
|
||||
| Value::Int { span, .. }
|
||||
@ -495,18 +497,11 @@ impl Value {
|
||||
| Value::CellPath { span, .. }
|
||||
| Value::CustomValue { span, .. }
|
||||
| Value::LazyRecord { span, .. }
|
||||
| Value::MatchPattern { span, .. } => Ok(*span),
|
||||
Value::Error { error } => Err(*error.clone()),
|
||||
| Value::MatchPattern { span, .. }
|
||||
| Value::Error { span, .. } => *span,
|
||||
}
|
||||
}
|
||||
|
||||
/// Special variant of the above designed to be called only in
|
||||
/// situations where the value not being a Value::Error has been guaranteed
|
||||
/// by match arms.
|
||||
pub fn expect_span(&self) -> Span {
|
||||
self.span().expect("non-Error Value had no span")
|
||||
}
|
||||
|
||||
/// Update the value with a new span
|
||||
pub fn with_span(mut self, new_span: Span) -> Value {
|
||||
match &mut self {
|
||||
@ -625,7 +620,7 @@ impl Value {
|
||||
separator: &str,
|
||||
config: &Config,
|
||||
) -> Result<String, ShellError> {
|
||||
if let Value::Error { error } = self {
|
||||
if let Value::Error { error, .. } = self {
|
||||
Err(*error.to_owned())
|
||||
} else {
|
||||
Ok(self.into_string(separator, config))
|
||||
@ -677,11 +672,12 @@ impl Value {
|
||||
.collect::<Vec<_>>()
|
||||
.join(separator)
|
||||
),
|
||||
Value::LazyRecord { val, .. } => {
|
||||
Value::LazyRecord { val, span } => {
|
||||
let collected = match val.collect() {
|
||||
Ok(val) => val,
|
||||
Err(error) => Value::Error {
|
||||
error: Box::new(error),
|
||||
span: *span,
|
||||
},
|
||||
};
|
||||
collected.into_string(separator, config)
|
||||
@ -689,7 +685,7 @@ impl Value {
|
||||
Value::Block { val, .. } => format!("<Block {val}>"),
|
||||
Value::Closure { val, .. } => format!("<Closure {val}>"),
|
||||
Value::Nothing { .. } => String::new(),
|
||||
Value::Error { error } => format!("{error:?}"),
|
||||
Value::Error { error, .. } => format!("{error:?}"),
|
||||
Value::Binary { val, .. } => format!("{val:?}"),
|
||||
Value::CellPath { val, .. } => val.into_string(),
|
||||
Value::CustomValue { val, .. } => val.value_string(),
|
||||
@ -744,7 +740,7 @@ impl Value {
|
||||
Value::Block { val, .. } => format!("<Block {val}>"),
|
||||
Value::Closure { val, .. } => format!("<Closure {val}>"),
|
||||
Value::Nothing { .. } => String::new(),
|
||||
Value::Error { error } => format!("{error:?}"),
|
||||
Value::Error { error, .. } => format!("{error:?}"),
|
||||
Value::Binary { val, .. } => format!("{val:?}"),
|
||||
Value::CellPath { val, .. } => val.into_string(),
|
||||
Value::CustomValue { val, .. } => val.value_string(),
|
||||
@ -844,7 +840,7 @@ impl Value {
|
||||
Value::Block { val, .. } => format!("<Block {val}>"),
|
||||
Value::Closure { val, .. } => format!("<Closure {val}>"),
|
||||
Value::Nothing { .. } => String::new(),
|
||||
Value::Error { error } => format!("{error:?}"),
|
||||
Value::Error { error, .. } => format!("{error:?}"),
|
||||
Value::Binary { val, .. } => format!("{val:?}"),
|
||||
Value::CellPath { val, .. } => val.into_string(),
|
||||
Value::CustomValue { val, .. } => val.value_string(),
|
||||
@ -868,6 +864,10 @@ impl Value {
|
||||
matches!(self, Value::Nothing { .. })
|
||||
}
|
||||
|
||||
pub fn is_error(&self) -> bool {
|
||||
matches!(self, Value::Error { .. })
|
||||
}
|
||||
|
||||
/// Follow a given cell path into the value: for example accessing select elements in a stream or list
|
||||
pub fn follow_cell_path(
|
||||
self,
|
||||
@ -961,7 +961,7 @@ impl Value {
|
||||
span: *origin_span,
|
||||
})
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
x => {
|
||||
return Err(ShellError::IncompatiblePathAccess { type_name:format!("{}",x.get_type()), span: *origin_span })
|
||||
}
|
||||
@ -1041,7 +1041,7 @@ impl Value {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: val.span().unwrap_or(*span),
|
||||
src_span: val.span(),
|
||||
});
|
||||
}
|
||||
} else if *optional && matches!(val, Value::Nothing { .. }) {
|
||||
@ -1050,7 +1050,7 @@ impl Value {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: val.span().unwrap_or(*span),
|
||||
src_span: val.span(),
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1066,7 +1066,7 @@ impl Value {
|
||||
Value::Nothing { .. } if *optional => {
|
||||
return Ok(Value::nothing(*origin_span)); // short-circuit
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
x => {
|
||||
return Err(ShellError::IncompatiblePathAccess {
|
||||
type_name: format!("{}", x.get_type()),
|
||||
@ -1078,7 +1078,7 @@ impl Value {
|
||||
}
|
||||
// If a single Value::Error was produced by the above (which won't happen if nullify_errors is true), unwrap it now.
|
||||
// Note that Value::Errors inside Lists remain as they are, so that the rest of the list can still potentially be used.
|
||||
if let Value::Error { error } = current {
|
||||
if let Value::Error { error, .. } = current {
|
||||
Err(*error)
|
||||
} else {
|
||||
Ok(current)
|
||||
@ -1096,7 +1096,7 @@ impl Value {
|
||||
let new_val = callback(&orig.follow_cell_path(cell_path, false)?);
|
||||
|
||||
match new_val {
|
||||
Value::Error { error } => Err(*error),
|
||||
Value::Error { error, .. } => Err(*error),
|
||||
new_val => self.upsert_data_at_cell_path(cell_path, new_val),
|
||||
}
|
||||
}
|
||||
@ -1133,7 +1133,7 @@ impl Value {
|
||||
break;
|
||||
} else {
|
||||
let mut new_col =
|
||||
Value::record(Record::new(), new_val.span()?);
|
||||
Value::record(Record::new(), new_val.span());
|
||||
new_col.upsert_data_at_cell_path(
|
||||
&cell_path[1..],
|
||||
new_val,
|
||||
@ -1143,12 +1143,12 @@ impl Value {
|
||||
}
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1167,7 +1167,7 @@ impl Value {
|
||||
let new_col = if cell_path.len() == 1 {
|
||||
new_val
|
||||
} else {
|
||||
let mut new_col = Value::record(Record::new(), new_val.span()?);
|
||||
let mut new_col = Value::record(Record::new(), new_val.span());
|
||||
new_col.upsert_data_at_cell_path(&cell_path[1..], new_val)?;
|
||||
new_col
|
||||
};
|
||||
@ -1181,12 +1181,12 @@ impl Value {
|
||||
record.upsert_data_at_cell_path(cell_path, new_val)?;
|
||||
*self = record
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
},
|
||||
@ -1207,11 +1207,11 @@ impl Value {
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
},
|
||||
@ -1234,7 +1234,7 @@ impl Value {
|
||||
let new_val = callback(&orig.follow_cell_path(cell_path, false)?);
|
||||
|
||||
match new_val {
|
||||
Value::Error { error } => Err(*error),
|
||||
Value::Error { error, .. } => Err(*error),
|
||||
|
||||
new_val => self.update_data_at_cell_path(cell_path, new_val),
|
||||
}
|
||||
@ -1277,12 +1277,12 @@ impl Value {
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1314,12 +1314,12 @@ impl Value {
|
||||
record.update_data_at_cell_path(cell_path, new_val)?;
|
||||
*self = record
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
},
|
||||
@ -1338,11 +1338,11 @@ impl Value {
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(*error.to_owned()),
|
||||
Value::Error { error, .. } => return Err(*error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
},
|
||||
@ -1396,7 +1396,7 @@ impl Value {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1438,7 +1438,7 @@ impl Value {
|
||||
v => Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
}),
|
||||
},
|
||||
PathMember::Int {
|
||||
@ -1463,7 +1463,7 @@ impl Value {
|
||||
}
|
||||
v => Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
}),
|
||||
},
|
||||
}
|
||||
@ -1502,7 +1502,7 @@ impl Value {
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1540,7 +1540,7 @@ impl Value {
|
||||
v => Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
}),
|
||||
},
|
||||
PathMember::Int {
|
||||
@ -1564,7 +1564,7 @@ impl Value {
|
||||
}
|
||||
v => Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
}),
|
||||
},
|
||||
}
|
||||
@ -1613,7 +1613,7 @@ impl Value {
|
||||
record.push(col_name, new_val.clone());
|
||||
}
|
||||
// SIGH...
|
||||
Value::Error { error } => return Err(*error.clone()),
|
||||
Value::Error { error, .. } => return Err(*error.clone()),
|
||||
_ => {
|
||||
return Err(ShellError::UnsupportedInput(
|
||||
"expected table or record".into(),
|
||||
@ -1684,7 +1684,7 @@ impl Value {
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
src_span: v.span(),
|
||||
})
|
||||
}
|
||||
},
|
||||
@ -1774,9 +1774,10 @@ impl Value {
|
||||
Value::Nothing { span }
|
||||
}
|
||||
|
||||
pub fn error(error: ShellError) -> Value {
|
||||
pub fn error(error: ShellError, span: Span) -> Value {
|
||||
Value::Error {
|
||||
error: Box::new(error),
|
||||
span,
|
||||
}
|
||||
}
|
||||
|
||||
@ -2399,9 +2400,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2436,9 +2437,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2517,9 +2518,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2627,9 +2628,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2764,9 +2765,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2900,9 +2901,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -2923,9 +2924,9 @@ impl Value {
|
||||
return Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
});
|
||||
}
|
||||
|
||||
@ -2938,9 +2939,9 @@ impl Value {
|
||||
Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -2966,9 +2967,9 @@ impl Value {
|
||||
return Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
});
|
||||
}
|
||||
|
||||
@ -2980,9 +2981,9 @@ impl Value {
|
||||
.ok_or(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -3007,9 +3008,9 @@ impl Value {
|
||||
return Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
});
|
||||
}
|
||||
|
||||
@ -3021,9 +3022,9 @@ impl Value {
|
||||
.ok_or(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -3048,9 +3049,9 @@ impl Value {
|
||||
return Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
});
|
||||
}
|
||||
|
||||
@ -3062,9 +3063,9 @@ impl Value {
|
||||
None => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3087,9 +3088,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3113,9 +3114,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3171,9 +3172,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3228,9 +3229,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3304,9 +3305,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3323,9 +3324,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3342,9 +3343,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3361,9 +3362,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3380,9 +3381,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3399,9 +3400,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3418,9 +3419,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3437,9 +3438,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3493,9 +3494,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3512,9 +3513,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3531,9 +3532,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3550,9 +3551,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
@ -3585,9 +3586,9 @@ impl Value {
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type().to_string(),
|
||||
lhs_span: self.span()?,
|
||||
lhs_span: self.span(),
|
||||
rhs_ty: rhs.get_type().to_string(),
|
||||
rhs_span: rhs.span()?,
|
||||
rhs_span: rhs.span(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ impl Range {
|
||||
self,
|
||||
ctrlc: Option<Arc<AtomicBool>>,
|
||||
) -> Result<RangeIterator, ShellError> {
|
||||
let span = self.from.span()?;
|
||||
let span = self.from.span();
|
||||
|
||||
Ok(RangeIterator::new(self, ctrlc, span))
|
||||
}
|
||||
@ -217,6 +217,7 @@ impl Iterator for RangeIterator {
|
||||
self.done = true;
|
||||
return Some(Value::Error {
|
||||
error: Box::new(ShellError::CannotCreateRange { span: self.span }),
|
||||
span: self.span,
|
||||
});
|
||||
};
|
||||
|
||||
@ -237,6 +238,7 @@ impl Iterator for RangeIterator {
|
||||
self.done = true;
|
||||
return Some(Value::Error {
|
||||
error: Box::new(error),
|
||||
span: self.span,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -76,7 +76,7 @@ impl RawStream {
|
||||
for next in self {
|
||||
match next {
|
||||
Ok(val) => {
|
||||
if let Value::Error { error } = val {
|
||||
if let Value::Error { error, .. } = val {
|
||||
return Err(*error);
|
||||
}
|
||||
}
|
||||
@ -213,7 +213,7 @@ impl ListStream {
|
||||
|
||||
pub fn drain(self) -> Result<(), ShellError> {
|
||||
for next in self {
|
||||
if let Value::Error { error } = next {
|
||||
if let Value::Error { error, .. } = next {
|
||||
return Err(*error);
|
||||
}
|
||||
}
|
||||
|
@ -32,119 +32,111 @@ pub enum Unit {
|
||||
}
|
||||
|
||||
impl Unit {
|
||||
pub fn to_value(&self, size: i64, span: Span) -> Value {
|
||||
pub fn to_value(&self, size: i64, span: Span) -> Result<Value, ShellError> {
|
||||
match self {
|
||||
Unit::Byte => Value::Filesize { val: size, span },
|
||||
Unit::Kilobyte => Value::Filesize {
|
||||
Unit::Byte => Ok(Value::Filesize { val: size, span }),
|
||||
Unit::Kilobyte => Ok(Value::Filesize {
|
||||
val: size * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Megabyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Megabyte => Ok(Value::Filesize {
|
||||
val: size * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Gigabyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Gigabyte => Ok(Value::Filesize {
|
||||
val: size * 1000 * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Terabyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Terabyte => Ok(Value::Filesize {
|
||||
val: size * 1000 * 1000 * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Petabyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Petabyte => Ok(Value::Filesize {
|
||||
val: size * 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Exabyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Exabyte => Ok(Value::Filesize {
|
||||
val: size * 1000 * 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
}),
|
||||
|
||||
Unit::Kibibyte => Value::Filesize {
|
||||
Unit::Kibibyte => Ok(Value::Filesize {
|
||||
val: size * 1024,
|
||||
span,
|
||||
},
|
||||
Unit::Mebibyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Mebibyte => Ok(Value::Filesize {
|
||||
val: size * 1024 * 1024,
|
||||
span,
|
||||
},
|
||||
Unit::Gibibyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Gibibyte => Ok(Value::Filesize {
|
||||
val: size * 1024 * 1024 * 1024,
|
||||
span,
|
||||
},
|
||||
Unit::Tebibyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Tebibyte => Ok(Value::Filesize {
|
||||
val: size * 1024 * 1024 * 1024 * 1024,
|
||||
span,
|
||||
},
|
||||
Unit::Pebibyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Pebibyte => Ok(Value::Filesize {
|
||||
val: size * 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
span,
|
||||
},
|
||||
Unit::Exbibyte => Value::Filesize {
|
||||
}),
|
||||
Unit::Exbibyte => Ok(Value::Filesize {
|
||||
val: size * 1024 * 1024 * 1024 * 1024 * 1024 * 1024,
|
||||
span,
|
||||
},
|
||||
}),
|
||||
|
||||
Unit::Nanosecond => Value::Duration { val: size, span },
|
||||
Unit::Microsecond => Value::Duration {
|
||||
Unit::Nanosecond => Ok(Value::Duration { val: size, span }),
|
||||
Unit::Microsecond => Ok(Value::Duration {
|
||||
val: size * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Millisecond => Value::Duration {
|
||||
}),
|
||||
Unit::Millisecond => Ok(Value::Duration {
|
||||
val: size * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
Unit::Second => Value::Duration {
|
||||
}),
|
||||
Unit::Second => Ok(Value::Duration {
|
||||
val: size * 1000 * 1000 * 1000,
|
||||
span,
|
||||
},
|
||||
}),
|
||||
Unit::Minute => match size.checked_mul(1000 * 1000 * 1000 * 60) {
|
||||
Some(val) => Value::Duration { val, span },
|
||||
None => Value::Error {
|
||||
error: Box::new(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Some(val) => Ok(Value::Duration { val, span }),
|
||||
None => Err(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Unit::Hour => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60) {
|
||||
Some(val) => Value::Duration { val, span },
|
||||
None => Value::Error {
|
||||
error: Box::new(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Some(val) => Ok(Value::Duration { val, span }),
|
||||
None => Err(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Unit::Day => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60 * 24) {
|
||||
Some(val) => Value::Duration { val, span },
|
||||
None => Value::Error {
|
||||
error: Box::new(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Some(val) => Ok(Value::Duration { val, span }),
|
||||
None => Err(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Unit::Week => match size.checked_mul(1000 * 1000 * 1000 * 60 * 60 * 24 * 7) {
|
||||
Some(val) => Value::Duration { val, span },
|
||||
None => Value::Error {
|
||||
error: Box::new(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
Some(val) => Ok(Value::Duration { val, span }),
|
||||
None => Err(ShellError::GenericError(
|
||||
"duration too large".into(),
|
||||
"duration too large".into(),
|
||||
Some(span),
|
||||
None,
|
||||
Vec::new(),
|
||||
)),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user