forked from extern/nushell
Document and critically review ShellError
variants - Ep. 3 (#8340)
Continuation of #8229 and #8326 # Description The `ShellError` enum at the moment is kind of messy. Many variants are basic tuple structs where you always have to reference the implementation with its macro invocation to know which field serves which purpose. Furthermore we have both variants that are kind of redundant or either overly broad to be useful for the user to match on or overly specific with few uses. So I set out to start fixing the lacking documentation and naming to make it feasible to critically review the individual usages and fix those. Furthermore we can decide to join or split up variants that don't seem to be fit for purpose. # Call to action **Everyone:** Feel free to add review comments if you spot inconsistent use of `ShellError` variants. # User-Facing Changes (None now, end goal more explicit and consistent error messages) # Tests + Formatting (No additional tests needed so far) # Commits (so far) - Remove `ShellError::FeatureNotEnabled` - Name fields on `SE::ExternalNotSupported` - Name field on `SE::InvalidProbability` - Name fields on `SE::NushellFailed` variants - Remove unused `SE::NushellFailedSpannedHelp` - Name field on `SE::VariableNotFoundAtRuntime` - Name fields on `SE::EnvVarNotFoundAtRuntime` - Name fields on `SE::ModuleNotFoundAtRuntime` - Remove usused `ModuleOrOverlayNotFoundAtRuntime` - Name fields on `SE::OverlayNotFoundAtRuntime` - Name field on `SE::NotFound`
This commit is contained in:
committed by
GitHub
parent
4898750fc1
commit
62575c9a4f
@ -27,17 +27,17 @@ pub trait CustomValue: fmt::Debug + Send + Sync {
|
||||
|
||||
// Follow cell path functions
|
||||
fn follow_path_int(&self, _count: usize, span: Span) -> Result<Value, ShellError> {
|
||||
Err(ShellError::IncompatiblePathAccess(
|
||||
format!("{} doesn't support path access", self.value_string()),
|
||||
Err(ShellError::IncompatiblePathAccess {
|
||||
type_name: self.value_string(),
|
||||
span,
|
||||
))
|
||||
})
|
||||
}
|
||||
|
||||
fn follow_path_string(&self, _column_name: String, span: Span) -> Result<Value, ShellError> {
|
||||
Err(ShellError::IncompatiblePathAccess(
|
||||
format!("{} doesn't support path access", self.value_string()),
|
||||
Err(ShellError::IncompatiblePathAccess {
|
||||
type_name: self.value_string(),
|
||||
span,
|
||||
))
|
||||
})
|
||||
}
|
||||
|
||||
// ordering with other value
|
||||
|
@ -4,12 +4,12 @@ impl Value {
|
||||
pub fn as_f64(&self) -> Result<f64, ShellError> {
|
||||
match self {
|
||||
Value::Float { val, .. } => Ok(*val),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"f64".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "f64".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,12 +18,12 @@ impl Value {
|
||||
Value::Int { val, .. } => Ok(*val),
|
||||
Value::Filesize { val, .. } => Ok(*val),
|
||||
Value::Duration { val, .. } => Ok(*val),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"i64".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "i64".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,12 +34,12 @@ impl FromValue for Spanned<i64> {
|
||||
span: *span,
|
||||
}),
|
||||
|
||||
v => Err(ShellError::CantConvert(
|
||||
"integer".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -51,12 +51,12 @@ impl FromValue for i64 {
|
||||
Value::Filesize { val, .. } => Ok(*val),
|
||||
Value::Duration { val, .. } => Ok(*val),
|
||||
|
||||
v => Err(ShellError::CantConvert(
|
||||
"integer".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -73,12 +73,12 @@ impl FromValue for Spanned<f64> {
|
||||
span: *span,
|
||||
}),
|
||||
|
||||
v => Err(ShellError::CantConvert(
|
||||
"float".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -88,12 +88,12 @@ impl FromValue for f64 {
|
||||
match v {
|
||||
Value::Float { val, .. } => Ok(*val),
|
||||
Value::Int { val, .. } => Ok(*val as f64),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"float".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -132,12 +132,12 @@ impl FromValue for Spanned<usize> {
|
||||
}
|
||||
}
|
||||
|
||||
v => Err(ShellError::CantConvert(
|
||||
"non-negative integer".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "non-negative integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -167,12 +167,12 @@ impl FromValue for usize {
|
||||
}
|
||||
}
|
||||
|
||||
v => Err(ShellError::CantConvert(
|
||||
"non-negative integer".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "non-negative integer".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -183,12 +183,12 @@ impl FromValue for String {
|
||||
match v {
|
||||
Value::CellPath { val, .. } => Ok(val.into_string()),
|
||||
Value::String { val, .. } => Ok(val.clone()),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -200,12 +200,12 @@ impl FromValue for Spanned<String> {
|
||||
Value::CellPath { val, .. } => val.into_string(),
|
||||
Value::String { val, .. } => val.clone(),
|
||||
v => {
|
||||
return Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
))
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
})
|
||||
}
|
||||
},
|
||||
span: v.span()?,
|
||||
@ -221,20 +221,20 @@ impl FromValue for Vec<String> {
|
||||
.iter()
|
||||
.map(|val| match val {
|
||||
Value::String { val, .. } => Ok(val.clone()),
|
||||
c => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
c.get_type().to_string(),
|
||||
c.span()?,
|
||||
None,
|
||||
)),
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
.collect::<Result<Vec<String>, ShellError>>(),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -250,20 +250,20 @@ impl FromValue for Vec<Spanned<String>> {
|
||||
item: val.clone(),
|
||||
span: *span,
|
||||
}),
|
||||
c => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
c.get_type().to_string(),
|
||||
c.span()?,
|
||||
None,
|
||||
)),
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
.collect::<Result<Vec<Spanned<String>>, ShellError>>(),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -275,20 +275,20 @@ impl FromValue for Vec<bool> {
|
||||
.iter()
|
||||
.map(|val| match val {
|
||||
Value::Bool { val, .. } => Ok(*val),
|
||||
c => Err(ShellError::CantConvert(
|
||||
"bool".into(),
|
||||
c.get_type().to_string(),
|
||||
c.span()?,
|
||||
None,
|
||||
)),
|
||||
c => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: c.get_type().to_string(),
|
||||
span: c.span()?,
|
||||
help: None,
|
||||
}),
|
||||
})
|
||||
.collect::<Result<Vec<bool>, ShellError>>(),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"bool".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -316,12 +316,12 @@ impl FromValue for CellPath {
|
||||
})
|
||||
}
|
||||
}
|
||||
x => Err(ShellError::CantConvert(
|
||||
"cell path".into(),
|
||||
x.get_type().to_string(),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "cell path".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span,
|
||||
None,
|
||||
)),
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -330,12 +330,12 @@ impl FromValue for bool {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
match v {
|
||||
Value::Bool { val, .. } => Ok(*val),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"bool".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -347,12 +347,12 @@ impl FromValue for Spanned<bool> {
|
||||
item: *val,
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"bool".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "bool".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -361,12 +361,12 @@ impl FromValue for DateTime<FixedOffset> {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
match v {
|
||||
Value::Date { val, .. } => Ok(*val),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"date".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "date".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -378,12 +378,12 @@ impl FromValue for Spanned<DateTime<FixedOffset>> {
|
||||
item: *val,
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"date".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "date".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -392,12 +392,12 @@ impl FromValue for Range {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
match v {
|
||||
Value::Range { val, .. } => Ok((**val).clone()),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"range".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -409,12 +409,12 @@ impl FromValue for Spanned<Range> {
|
||||
item: (**val).clone(),
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"range".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -424,12 +424,12 @@ impl FromValue for Vec<u8> {
|
||||
match v {
|
||||
Value::Binary { val, .. } => Ok(val.clone()),
|
||||
Value::String { val, .. } => Ok(val.bytes().collect()),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"binary data".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "binary data".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -445,12 +445,12 @@ impl FromValue for Spanned<Vec<u8>> {
|
||||
item: val.bytes().collect(),
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"binary data".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "binary data".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -463,12 +463,12 @@ impl FromValue for Spanned<PathBuf> {
|
||||
.map_err(|err| ShellError::FileNotFoundCustom(err.to_string(), *span))?,
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"range".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "range".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -478,12 +478,12 @@ impl FromValue for Vec<Value> {
|
||||
// FIXME: we may want to fail a little nicer here
|
||||
match v {
|
||||
Value::List { vals, .. } => Ok(vals.clone()),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"Vector of values".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Vector of values".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -493,12 +493,12 @@ impl FromValue for (Vec<String>, Vec<Value>) {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
match v {
|
||||
Value::Record { cols, vals, .. } => Ok((cols.clone(), vals.clone())),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"Record".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Record".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -514,12 +514,12 @@ impl FromValue for Closure {
|
||||
block_id: *val,
|
||||
captures: HashMap::new(),
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"Closure".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Closure".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -528,12 +528,12 @@ impl FromValue for Block {
|
||||
fn from_value(v: &Value) -> Result<Self, ShellError> {
|
||||
match v {
|
||||
Value::Block { val, .. } => Ok(Block { block_id: *val }),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"Block".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Block".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -552,12 +552,12 @@ impl FromValue for Spanned<Closure> {
|
||||
},
|
||||
span: *span,
|
||||
}),
|
||||
v => Err(ShellError::CantConvert(
|
||||
"Closure".into(),
|
||||
v.get_type().to_string(),
|
||||
v.span()?,
|
||||
None,
|
||||
)),
|
||||
v => Err(ShellError::CantConvert {
|
||||
to_type: "Closure".into(),
|
||||
from_type: v.get_type().to_string(),
|
||||
span: v.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,21 +197,21 @@ impl Value {
|
||||
Value::Binary { val, .. } => Ok(match std::str::from_utf8(val) {
|
||||
Ok(s) => s.to_string(),
|
||||
Err(_) => {
|
||||
return Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
"binary".into(),
|
||||
self.span()?,
|
||||
None,
|
||||
));
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: "binary".into(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
});
|
||||
}
|
||||
}),
|
||||
Value::Date { val, .. } => Ok(val.to_rfc3339_opts(chrono::SecondsFormat::Millis, true)),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,32 +227,32 @@ impl Value {
|
||||
span: *span,
|
||||
},
|
||||
Err(_) => {
|
||||
return Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
"binary".into(),
|
||||
self.span()?,
|
||||
None,
|
||||
))
|
||||
return Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: "binary".into(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
})
|
||||
}
|
||||
}),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"string".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "string".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_path(&self) -> Result<PathBuf, ShellError> {
|
||||
match self {
|
||||
Value::String { val, .. } => Ok(PathBuf::from(val)),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"path".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "path".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -260,12 +260,12 @@ impl Value {
|
||||
match self {
|
||||
Value::Block { val, .. } => Ok(*val),
|
||||
Value::Closure { val, .. } => Ok(*val),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"block".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "block".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -273,48 +273,48 @@ impl Value {
|
||||
match self {
|
||||
Value::Binary { val, .. } => Ok(val),
|
||||
Value::String { val, .. } => Ok(val.as_bytes()),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"binary".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "binary".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_record(&self) -> Result<(&[String], &[Value]), ShellError> {
|
||||
match self {
|
||||
Value::Record { cols, vals, .. } => Ok((cols, vals)),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"record".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "record".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_list(&self) -> Result<&[Value], ShellError> {
|
||||
match self {
|
||||
Value::List { vals, .. } => Ok(vals),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"list".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "list".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_bool(&self) -> Result<bool, ShellError> {
|
||||
match self {
|
||||
Value::Bool { val, .. } => Ok(*val),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"boolean".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "boolean".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,24 +322,24 @@ impl Value {
|
||||
match self {
|
||||
Value::Float { val, .. } => Ok(*val),
|
||||
Value::Int { val, .. } => Ok(*val as f64),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"float".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "float".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_integer(&self) -> Result<i64, ShellError> {
|
||||
match self {
|
||||
Value::Int { val, .. } => Ok(*val),
|
||||
x => Err(ShellError::CantConvert(
|
||||
"integer".into(),
|
||||
x.get_type().to_string(),
|
||||
self.span()?,
|
||||
None,
|
||||
)),
|
||||
x => Err(ShellError::CantConvert {
|
||||
to_type: "integer".into(),
|
||||
from_type: x.get_type().to_string(),
|
||||
span: self.span()?,
|
||||
help: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
@ -722,12 +722,15 @@ impl Value {
|
||||
current = item.clone();
|
||||
} else if val.is_empty() {
|
||||
err_or_null!(
|
||||
ShellError::AccessEmptyContent(*origin_span),
|
||||
ShellError::AccessEmptyContent { span: *origin_span },
|
||||
*origin_span
|
||||
)
|
||||
} else {
|
||||
err_or_null!(
|
||||
ShellError::AccessBeyondEnd(val.len() - 1, *origin_span),
|
||||
ShellError::AccessBeyondEnd {
|
||||
max_idx: val.len() - 1,
|
||||
span: *origin_span
|
||||
},
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -737,12 +740,15 @@ impl Value {
|
||||
current = Value::int(*item as i64, *origin_span);
|
||||
} else if val.is_empty() {
|
||||
err_or_null!(
|
||||
ShellError::AccessEmptyContent(*origin_span),
|
||||
ShellError::AccessEmptyContent { span: *origin_span },
|
||||
*origin_span
|
||||
)
|
||||
} else {
|
||||
err_or_null!(
|
||||
ShellError::AccessBeyondEnd(val.len() - 1, *origin_span),
|
||||
ShellError::AccessBeyondEnd {
|
||||
max_idx: val.len() - 1,
|
||||
span: *origin_span
|
||||
},
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -752,7 +758,7 @@ impl Value {
|
||||
current = item.clone();
|
||||
} else {
|
||||
err_or_null!(
|
||||
ShellError::AccessBeyondEndOfStream(*origin_span),
|
||||
ShellError::AccessBeyondEndOfStream { span: *origin_span },
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -770,10 +776,10 @@ impl Value {
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
x => {
|
||||
err_or_null!(
|
||||
ShellError::IncompatiblePathAccess(
|
||||
format!("{}", x.get_type()),
|
||||
*origin_span,
|
||||
),
|
||||
ShellError::IncompatiblePathAccess {
|
||||
type_name: format!("{}", x.get_type()),
|
||||
span: *origin_span
|
||||
},
|
||||
*origin_span
|
||||
)
|
||||
}
|
||||
@ -806,11 +812,11 @@ impl Value {
|
||||
}
|
||||
}
|
||||
err_or_null!(
|
||||
ShellError::CantFindColumn(
|
||||
column_name.to_string(),
|
||||
*origin_span,
|
||||
span,
|
||||
),
|
||||
ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: span
|
||||
},
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -830,11 +836,11 @@ impl Value {
|
||||
}
|
||||
}
|
||||
err_or_null!(
|
||||
ShellError::CantFindColumn(
|
||||
column_name.to_string(),
|
||||
*origin_span,
|
||||
*span,
|
||||
),
|
||||
ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: *span
|
||||
},
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -874,13 +880,11 @@ impl Value {
|
||||
Value::nothing(*origin_span)
|
||||
} else {
|
||||
Value::Error {
|
||||
error: ShellError::CantFindColumn(
|
||||
column_name.to_string(),
|
||||
*origin_span,
|
||||
// Get the exact span of the value, falling back to
|
||||
// the list's span if it's a Value::Empty
|
||||
val.span().unwrap_or(*span),
|
||||
),
|
||||
error: ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: val.span().unwrap_or(*span),
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -890,13 +894,11 @@ impl Value {
|
||||
Value::nothing(*origin_span)
|
||||
} else {
|
||||
Value::Error {
|
||||
error: ShellError::CantFindColumn(
|
||||
column_name.to_string(),
|
||||
*origin_span,
|
||||
// Get the exact span of the value, falling back to
|
||||
// the list's span if it's a Value::Empty
|
||||
val.span().unwrap_or(*span),
|
||||
),
|
||||
error: ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: val.span().unwrap_or(*span),
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -908,11 +910,11 @@ impl Value {
|
||||
};
|
||||
} else {
|
||||
err_or_null!(
|
||||
ShellError::CantFindColumn(
|
||||
column_name.to_string(),
|
||||
*origin_span,
|
||||
*span,
|
||||
),
|
||||
ShellError::CantFindColumn {
|
||||
col_name: column_name.to_string(),
|
||||
span: *origin_span,
|
||||
src_span: *span
|
||||
},
|
||||
*origin_span
|
||||
);
|
||||
}
|
||||
@ -923,10 +925,10 @@ impl Value {
|
||||
Value::Error { error } => err_or_null!(error.to_owned(), *origin_span),
|
||||
x => {
|
||||
err_or_null!(
|
||||
ShellError::IncompatiblePathAccess(
|
||||
format!("{}", x.get_type()),
|
||||
*origin_span,
|
||||
),
|
||||
ShellError::IncompatiblePathAccess {
|
||||
type_name: format!("{}", x.get_type()),
|
||||
span: *origin_span
|
||||
},
|
||||
*origin_span
|
||||
)
|
||||
}
|
||||
@ -1005,11 +1007,11 @@ impl Value {
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1042,11 +1044,11 @@ impl Value {
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
},
|
||||
PathMember::Int { val: row_num, span } => match self {
|
||||
@ -1058,11 +1060,19 @@ impl Value {
|
||||
// Otherwise, it's prohibited.
|
||||
vals.push(new_val);
|
||||
} else {
|
||||
return Err(ShellError::InsertAfterNextFreeIndex(vals.len(), *span));
|
||||
return Err(ShellError::InsertAfterNextFreeIndex {
|
||||
available_idx: vals.len(),
|
||||
span: *span,
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => return Err(ShellError::NotAList(*span, v.span()?)),
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
None => {
|
||||
@ -1118,20 +1128,20 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1152,20 +1162,20 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
},
|
||||
PathMember::Int { val: row_num, span } => match self {
|
||||
@ -1173,13 +1183,21 @@ impl Value {
|
||||
if let Some(v) = vals.get_mut(*row_num) {
|
||||
v.update_data_at_cell_path(&cell_path[1..], new_val)?
|
||||
} else if vals.is_empty() {
|
||||
return Err(ShellError::AccessEmptyContent(*span));
|
||||
return Err(ShellError::AccessEmptyContent { span: *span });
|
||||
} else {
|
||||
return Err(ShellError::AccessBeyondEnd(vals.len() - 1, *span));
|
||||
return Err(ShellError::AccessBeyondEnd {
|
||||
max_idx: vals.len() - 1,
|
||||
span: *span,
|
||||
});
|
||||
}
|
||||
}
|
||||
Value::Error { error } => return Err(error.to_owned()),
|
||||
v => return Err(ShellError::NotAList(*span, v.span()?)),
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
None => {
|
||||
@ -1216,19 +1234,19 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
}
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1248,19 +1266,19 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
v => Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
)),
|
||||
v => Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
}),
|
||||
},
|
||||
PathMember::Int { val: row_num, span } => match self {
|
||||
Value::List { vals, .. } => {
|
||||
@ -1268,12 +1286,18 @@ impl Value {
|
||||
vals.remove(*row_num);
|
||||
Ok(())
|
||||
} else if vals.is_empty() {
|
||||
Err(ShellError::AccessEmptyContent(*span))
|
||||
Err(ShellError::AccessEmptyContent { span: *span })
|
||||
} else {
|
||||
Err(ShellError::AccessBeyondEnd(vals.len() - 1, *span))
|
||||
Err(ShellError::AccessBeyondEnd {
|
||||
max_idx: vals.len() - 1,
|
||||
span: *span,
|
||||
})
|
||||
}
|
||||
}
|
||||
v => Err(ShellError::NotAList(*span, v.span()?)),
|
||||
v => Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -1300,19 +1324,19 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
}
|
||||
v => {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
))
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1333,31 +1357,37 @@ impl Value {
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
v => Err(ShellError::CantFindColumn(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
v.span()?,
|
||||
)),
|
||||
v => Err(ShellError::CantFindColumn {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: v.span()?,
|
||||
}),
|
||||
},
|
||||
PathMember::Int { val: row_num, span } => match self {
|
||||
Value::List { vals, .. } => {
|
||||
if let Some(v) = vals.get_mut(*row_num) {
|
||||
v.remove_data_at_cell_path(&cell_path[1..])
|
||||
} else if vals.is_empty() {
|
||||
Err(ShellError::AccessEmptyContent(*span))
|
||||
Err(ShellError::AccessEmptyContent { span: *span })
|
||||
} else {
|
||||
Err(ShellError::AccessBeyondEnd(vals.len() - 1, *span))
|
||||
Err(ShellError::AccessBeyondEnd {
|
||||
max_idx: vals.len() - 1,
|
||||
span: *span,
|
||||
})
|
||||
}
|
||||
}
|
||||
v => Err(ShellError::NotAList(*span, v.span()?)),
|
||||
v => Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -1387,11 +1417,11 @@ impl Value {
|
||||
for col in cols.iter().zip(vals.iter_mut()) {
|
||||
if col.0 == col_name {
|
||||
if cell_path.len() == 1 {
|
||||
return Err(ShellError::ColumnAlreadyExists(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::ColumnAlreadyExists {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
} else {
|
||||
return col.1.insert_data_at_cell_path(
|
||||
&cell_path[1..],
|
||||
@ -1426,11 +1456,11 @@ impl Value {
|
||||
for col in cols.iter().zip(vals.iter_mut()) {
|
||||
if col.0 == col_name {
|
||||
if cell_path.len() == 1 {
|
||||
return Err(ShellError::ColumnAlreadyExists(
|
||||
col_name.to_string(),
|
||||
*span,
|
||||
*v_span,
|
||||
));
|
||||
return Err(ShellError::ColumnAlreadyExists {
|
||||
col_name: col_name.to_string(),
|
||||
span: *span,
|
||||
src_span: *v_span,
|
||||
});
|
||||
} else {
|
||||
return col.1.insert_data_at_cell_path(
|
||||
&cell_path[1..],
|
||||
@ -1462,10 +1492,18 @@ impl Value {
|
||||
// Otherwise, it's prohibited.
|
||||
vals.push(new_val);
|
||||
} else {
|
||||
return Err(ShellError::InsertAfterNextFreeIndex(vals.len(), *span));
|
||||
return Err(ShellError::InsertAfterNextFreeIndex {
|
||||
available_idx: vals.len(),
|
||||
span: *span,
|
||||
});
|
||||
}
|
||||
}
|
||||
v => return Err(ShellError::NotAList(*span, v.span()?)),
|
||||
v => {
|
||||
return Err(ShellError::NotAList {
|
||||
dst_span: *span,
|
||||
src_span: v.span()?,
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
None => {
|
||||
@ -2307,7 +2345,7 @@ impl Value {
|
||||
})
|
||||
}
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Int { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2317,7 +2355,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2327,7 +2365,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2337,7 +2375,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Filesize { val: rhs, .. }) => {
|
||||
@ -2354,7 +2392,7 @@ impl Value {
|
||||
})
|
||||
}
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2364,7 +2402,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2374,7 +2412,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
|
||||
@ -2391,7 +2429,7 @@ impl Value {
|
||||
})
|
||||
}
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2401,7 +2439,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2411,7 +2449,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::CustomValue { val: lhs, span }, rhs) => {
|
||||
@ -2439,7 +2477,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Int { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2451,7 +2489,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2463,7 +2501,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2475,7 +2513,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Filesize { val: rhs, .. }) => {
|
||||
@ -2487,7 +2525,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2499,7 +2537,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Filesize { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2511,7 +2549,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
|
||||
@ -2523,7 +2561,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -2535,7 +2573,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Duration { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -2547,7 +2585,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::CustomValue { val: lhs, span }, rhs) => {
|
||||
@ -3082,7 +3120,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Int { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -3092,7 +3130,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
@ -3102,7 +3140,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::Float { val: lhs, .. }, Value::Float { val: rhs, .. }) => {
|
||||
@ -3112,7 +3150,7 @@ impl Value {
|
||||
span,
|
||||
})
|
||||
} else {
|
||||
Err(ShellError::DivisionByZero(op))
|
||||
Err(ShellError::DivisionByZero { span: op })
|
||||
}
|
||||
}
|
||||
(Value::CustomValue { val: lhs, span }, rhs) => {
|
||||
|
@ -68,7 +68,7 @@ impl Range {
|
||||
incr.eq(expr_span, &zero, expr_span),
|
||||
Ok(Value::Bool { val: true, .. })
|
||||
) {
|
||||
return Err(ShellError::CannotCreateRange(expr_span));
|
||||
return Err(ShellError::CannotCreateRange { span: expr_span });
|
||||
}
|
||||
|
||||
// If to > from, then incr > 0, otherwise we iterate forever
|
||||
@ -76,7 +76,7 @@ impl Range {
|
||||
to.gt(operator.span, &from, expr_span)?,
|
||||
incr.gt(operator.next_op_span, &zero, expr_span)?,
|
||||
) {
|
||||
return Err(ShellError::CannotCreateRange(expr_span));
|
||||
return Err(ShellError::CannotCreateRange { span: expr_span });
|
||||
}
|
||||
|
||||
// If to < from, then incr < 0, otherwise we iterate forever
|
||||
@ -84,7 +84,7 @@ impl Range {
|
||||
to.lt(operator.span, &from, expr_span)?,
|
||||
incr.lt(operator.next_op_span, &zero, expr_span)?,
|
||||
) {
|
||||
return Err(ShellError::CannotCreateRange(expr_span));
|
||||
return Err(ShellError::CannotCreateRange { span: expr_span });
|
||||
}
|
||||
|
||||
Ok(Range {
|
||||
@ -218,7 +218,7 @@ impl Iterator for RangeIterator {
|
||||
} else {
|
||||
self.done = true;
|
||||
return Some(Value::Error {
|
||||
error: ShellError::CannotCreateRange(self.span),
|
||||
error: ShellError::CannotCreateRange { span: self.span },
|
||||
});
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user