From 9b331948fca2202e550f2cb7d348d888eab5be4f Mon Sep 17 00:00:00 2001 From: Лач Date: Thu, 25 Jun 2020 11:23:24 +0000 Subject: [PATCH] feat(evaluator): Err instead of panic on unknown variable --- --- a/crates/jsonnet-evaluator/src/ctx.rs +++ b/crates/jsonnet-evaluator/src/ctx.rs @@ -52,9 +52,11 @@ })) } - pub fn binding(&self, name: &str) -> LazyVal { - self.0.bindings.get(name).cloned().unwrap_or_else(|| { - panic!("can't find {} in {:?}", name, self); + pub fn binding(&self, name: &str) -> Result { + self.0.bindings.get(name).cloned().ok_or_else(|| { + create_error::<()>(Error::UnknownVariable(name.to_owned())) + .err() + .unwrap() }) } pub fn into_future(self, ctx: FutureContext) -> Context { --- a/crates/jsonnet-evaluator/src/error.rs +++ b/crates/jsonnet-evaluator/src/error.rs @@ -7,6 +7,8 @@ TypeMismatch(&'static str, Vec, ValType), NoSuchField(String), + UnknownVariable(String), + UnknownFunctionParameter(String), BindingParameterASecondTime(String), TooManyArgsFunctionHas(usize), --- a/crates/jsonnet-evaluator/src/evaluate.rs +++ b/crates/jsonnet-evaluator/src/evaluate.rs @@ -397,7 +397,7 @@ BinaryOp(v1, o, v2) => evaluate_binary_op_special(context, &v1, *o, &v2)?, UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?, Var(name) => push(locexpr, "var".to_owned(), || { - Val::Lazy(context.binding(&name)).unwrap_if_lazy() + Val::Lazy(context.binding(&name)?).unwrap_if_lazy() })?, Index(LocExpr(v, _), index) if matches!(&**v, Expr::Literal(LiteralType::Super)) => { let name = evaluate(context.clone(), index)?.try_cast_str("object index")?; -- gitstuff