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
before · crates/jsonnet-evaluator/src/error.rs
1use crate::ValType;2use jsonnet_parser::LocExpr;34#[derive(Debug)]5pub enum Error {6	VariableIsNotDefined(String),7	TypeMismatch(&'static str, Vec<ValType>, ValType),8	NoSuchField(String),910	UnknownFunctionParameter(String),11	BindingParameterASecondTime(String),12	TooManyArgsFunctionHas(usize),13	FunctionParameterNotBoundInCall(String),1415	UndefinedExternalVariable(String),1617	FieldMustBeStringGot(ValType),1819	RuntimeError(String),20	StackOverflow,21	FractionalIndex,22	DivisionByZero,23}2425#[derive(Clone, Debug)]26pub struct StackTraceElement(pub LocExpr, pub String);27#[derive(Debug)]28pub struct StackTrace(pub Vec<StackTraceElement>);2930#[derive(Debug)]31pub struct LocError(pub Error, pub StackTrace);32pub type Result<V> = std::result::Result<V, LocError>;
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) => {