difftreelog
feat(evaluator) index errors
in: master
2 files changed
crates/jsonnet-evaluator/src/error.rsdiffbeforeafterboth161617 FieldMustBeStringGot(ValType),17 FieldMustBeStringGot(ValType),1819 AttemptedIndexAnArrayWithString(String),20 ValueIndexMustBeTypeGot(ValType, ValType, ValType),21 CantIndexInto(ValType),182219 RuntimeError(String),23 RuntimeError(String),20 StackOverflow,24 StackOverflow,crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/evaluate.rs
+++ b/crates/jsonnet-evaluator/src/evaluate.rs
@@ -421,6 +421,12 @@
create_error(crate::Error::NoSuchField(s))?
}
}
+ (Val::Obj(_), n) => create_error(crate::Error::ValueIndexMustBeTypeGot(
+ ValType::Obj,
+ ValType::Str,
+ n.value_type()?,
+ ))?,
+
(Val::Arr(v), Val::Num(n)) => {
if n.fract() > f64::EPSILON {
create_error(crate::Error::FractionalIndex)?
@@ -430,10 +436,25 @@
.clone()
.unwrap_if_lazy()?
}
+ (Val::Arr(_), Val::Str(n)) => {
+ create_error(crate::Error::AttemptedIndexAnArrayWithString(n))?
+ }
+ (Val::Arr(_), n) => create_error(crate::Error::ValueIndexMustBeTypeGot(
+ ValType::Arr,
+ ValType::Num,
+ n.value_type()?,
+ ))?,
+
(Val::Str(s), Val::Num(n)) => {
Val::Str(s.chars().skip(n as usize).take(1).collect())
}
- (v, i) => todo!("not implemented: {:?}[{:?}]", v, i.unwrap_if_lazy()),
+ (Val::Str(_), n) => create_error(crate::Error::ValueIndexMustBeTypeGot(
+ ValType::Str,
+ ValType::Num,
+ n.value_type()?,
+ ))?,
+
+ (v, _) => create_error(crate::Error::CantIndexInto(v.value_type()?))?,
}
}
LocalExpr(bindings, returned) => {