--- a/crates/jsonnet-evaluator/src/error.rs +++ b/crates/jsonnet-evaluator/src/error.rs @@ -16,6 +16,10 @@ FieldMustBeStringGot(ValType), + AttemptedIndexAnArrayWithString(String), + ValueIndexMustBeTypeGot(ValType, ValType, ValType), + CantIndexInto(ValType), + RuntimeError(String), StackOverflow, FractionalIndex, --- 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) => {