git.delta.rocks / jrsonnet / refs/commits / 55e9769db459

difftreelog

feat(evaluator) index errors

Лач2020-06-11parent: #a18f0b6.patch.diff
in: master

2 files changed

modifiedcrates/jsonnet-evaluator/src/error.rsdiffbeforeafterboth
1616
17 FieldMustBeStringGot(ValType),17 FieldMustBeStringGot(ValType),
18
19 AttemptedIndexAnArrayWithString(String),
20 ValueIndexMustBeTypeGot(ValType, ValType, ValType),
21 CantIndexInto(ValType),
1822
19 RuntimeError(String),23 RuntimeError(String),
20 StackOverflow,24 StackOverflow,
modifiedcrates/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) => {