--- a/crates/jrsonnet-evaluator/src/evaluate/operator.rs +++ b/crates/jrsonnet-evaluator/src/evaluate/operator.rs @@ -60,6 +60,8 @@ use BinaryOpType::*; use Val::*; Ok(match (a, op, b) { + (Str(a), In, Obj(obj)) => Bool(obj.has_field_ex(a.clone(), true)), + (a, Add, b) => evaluate_add_op(a, b)?, (a, Eq, b) => Bool(equals(a, b)?), --- a/crates/jrsonnet-parser/src/expr.rs +++ b/crates/jrsonnet-parser/src/expr.rs @@ -127,6 +127,9 @@ And, Or, + + // Equialent to std.objectHasEx(a, b, true) + In, } impl Display for BinaryOpType { @@ -154,6 +157,7 @@ Neq => "!=", And => "&&", Or => "||", + In => "in", } ) } --- a/crates/jrsonnet-parser/src/lib.rs +++ b/crates/jrsonnet-parser/src/lib.rs @@ -217,38 +217,37 @@ rule unaryop(x: rule<()>) -> () = quiet!{ x() } / expected!("") + + use BinaryOpType::*; rule expr(s: &ParserSettings) -> LocExpr = start:position!() a:precedence! { - a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Or, b))} + a:(@) _ binop(<"||">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Or, b))} -- - a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::And, b))} + a:(@) _ binop(<"&&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, And, b))} -- - a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitOr, b))} + a:(@) _ binop(<"|">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitOr, b))} -- - a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitXor, b))} + a:@ _ binop(<"^">) _ b:(@) {loc_expr_todo!(Expr::BinaryOp(a, BitXor, b))} -- - a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::BitAnd, b))} + a:(@) _ binop(<"&">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BitAnd, b))} -- - 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, Eq, b))} + a:(@) _ binop(<"!=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, 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))} - a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lte, b))} - a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Gte, b))} - a:(@) _ binop() _ b:@ {loc_expr_todo!(Expr::Apply( - el!(Expr::Intrinsic("objectHasEx".into())), ArgsDesc(vec![Arg(None, b), Arg(None, a), Arg(None, el!(Expr::Literal(LiteralType::True)))]), - true - ))} + a:(@) _ binop(<"<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lt, b))} + a:(@) _ binop(<">">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gt, b))} + a:(@) _ binop(<"<=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lte, b))} + a:(@) _ binop(<">=">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Gte, b))} + a:(@) _ binop() _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, In, b))} -- - a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Lhs, b))} - a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Rhs, b))} + a:(@) _ binop(<"<<">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Lhs, b))} + a:(@) _ binop(<">>">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Rhs, b))} -- - a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Add, b))} - a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Sub, b))} + a:(@) _ binop(<"+">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Add, b))} + a:(@) _ binop(<"-">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Sub, b))} -- - a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Mul, b))} - a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, BinaryOpType::Div, b))} + a:(@) _ binop(<"*">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Mul, b))} + a:(@) _ binop(<"/">) _ b:@ {loc_expr_todo!(Expr::BinaryOp(a, Div, b))} a:(@) _ binop(<"%">) _ b:@ {loc_expr_todo!(Expr::Apply( el!(Expr::Intrinsic("mod".into())), ArgsDesc(vec![Arg(None, a), Arg(None, b)]), false @@ -306,6 +305,7 @@ use super::{expr::*, parse}; use crate::ParserSettings; use std::path::PathBuf; + use BinaryOpType::*; macro_rules! parse { ($s:expr) => { @@ -326,10 +326,10 @@ pub fn basic_math() -> LocExpr { el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Add, + Add, el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Mul, + Mul, el!(Expr::Num(2.0)), )), )) @@ -417,10 +417,10 @@ parse!("2+2*2"), el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Add, + Add, el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Mul, + Mul, el!(Expr::Num(2.0)) )) )) @@ -438,7 +438,7 @@ parse!("2+(2+2*2)"), el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Add, + Add, el!(Expr::Parened(expressions::basic_math())), )) ); @@ -451,10 +451,10 @@ parse!("2//comment\n+//comment\n3/*test*/*/*test*/4"), el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Add, + Add, el!(Expr::BinaryOp( el!(Expr::Num(3.0)), - BinaryOpType::Mul, + Mul, el!(Expr::Num(4.0)) )) )) @@ -468,7 +468,7 @@ parse!("2/*\\*/+*/ - 22"), el!(Expr::BinaryOp( el!(Expr::Num(2.0)), - BinaryOpType::Sub, + Sub, el!(Expr::Num(22.0)) )) ); @@ -520,7 +520,7 @@ parse!("!a && !b"), el!(BinaryOp( el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))), - BinaryOpType::And, + And, el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into())))) )) ); @@ -533,7 +533,7 @@ parse!("!a / !b"), el!(BinaryOp( el!(UnaryOp(UnaryOpType::Not, el!(Var("a".into())))), - BinaryOpType::Div, + Div, el!(UnaryOp(UnaryOpType::Not, el!(Var("b".into())))) )) );