--- a/crates/jrsonnet-evaluator/src/evaluate.rs +++ b/crates/jrsonnet-evaluator/src/evaluate.rs @@ -1,6 +1,7 @@ use crate::{ error::Error::*, lazy_val, push, throw, with_state, Context, ContextCreator, FuncDesc, FuncVal, FutureWrapper, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val, + equals, }; use closure::closure; use jrsonnet_interner::IStr; @@ -147,6 +148,9 @@ Ok(match (a, op, b) { (a, BinaryOpType::Add, b) => evaluate_add_op(a, b)?, + (a, BinaryOpType::Eq, b) => Val::Bool(equals(&a, &b)?), + (a, BinaryOpType::Neq, b) => Val::Bool(!equals(&a, &b)?), + (Val::Str(v1), BinaryOpType::Mul, Val::Num(v2)) => Val::Str(v1.repeat(*v2 as usize).into()), // Bool X Bool --- a/crates/jrsonnet-parser/src/expr.rs +++ b/crates/jrsonnet-parser/src/expr.rs @@ -113,6 +113,9 @@ BitOr, BitXor, + Eq, + Neq, + And, Or, } @@ -137,6 +140,8 @@ BitAnd => "&", BitOr => "|", BitXor => "^", + Eq => "==", + New => "!=", And => "&&", Or => "||", } --- a/crates/jrsonnet-parser/src/lib.rs +++ b/crates/jrsonnet-parser/src/lib.rs @@ -227,16 +227,8 @@ -- a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitAnd, b))} -- - a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::Apply( - el!(Expr::Intrinsic("equals".into())), - ArgsDesc(vec![Arg(None, a), Arg(None, b)]), - true - ))} - a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::UnaryOp(UnaryOpType::Not, el!(Expr::Apply( - el!(Expr::Intrinsic("equals".into())), - ArgsDesc(vec![Arg(None, a), Arg(None, b)]), - true - ))))} + a:(@) _ binop(<"==">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Eq, b))} + a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Neq, b))} -- a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lt, b))} a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gt, b))}