diff --git a/src/lib.rs b/src/lib.rs index dc05a4a..363d965 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -230,6 +230,25 @@ mod tests { Ok(()) } + #[test] + fn pipe_operator() -> Result<()> { + let jslt: Jslt = r#" + .menu.popup.menuitem | { + "Open" : .[0].onclick, + "Close" : .[1].onclick + } | { + "result" : . + } + "# + .parse()?; + + let output = jslt.transform_value(&BASIC_INPUT)?; + + assert_eq!(&output, BASIC_OUTPUT.deref()); + + Ok(()) + } + #[test] fn object_for() -> Result<()> { let jslt: Jslt = r#" diff --git a/src/parser/jslt.pest b/src/parser/jslt.pest index d79fb94..a4ed123 100644 --- a/src/parser/jslt.pest +++ b/src/parser/jslt.pest @@ -6,7 +6,7 @@ Expr = _{ OperatorExpr | ValueExpr } ValueExpr = _{ VariableDef | FunctionDef | IfStatement | Value } OperatorExpr = { ValueExpr ~ (Operator ~ ValueExpr)+ } -Operator = _{ Add | Sub | Div | Mul | Gte | Gt | Lte | Lt | And | Or | Equal | NotEqual } +Operator = _{ Add | Sub | Div | Mul | Gte | Gt | Lte | Lt | And | Or | Equal | NotEqual | Pipe } Add = { "+" } Sub = { "-" } @@ -20,6 +20,7 @@ Equal = { "==" } NotEqual = { "!=" } And = { "and" } Or = { "or" } +Pipe = { "|" } If = _{ "if" } For = _{ "for" } Def = _{ "def " } diff --git a/src/transform/expr.rs b/src/transform/expr.rs index d70cfc4..91e93c6 100644 --- a/src/transform/expr.rs +++ b/src/transform/expr.rs @@ -92,6 +92,7 @@ pub enum OperatorTransformer { Lte, Equal, NotEqual, + Pipe, } impl fmt::Display for OperatorTransformer { @@ -109,6 +110,7 @@ impl fmt::Display for OperatorTransformer { OperatorTransformer::Lte => f.write_str("<="), OperatorTransformer::Equal => f.write_str("=="), OperatorTransformer::NotEqual => f.write_str("!="), + OperatorTransformer::Pipe => f.write_str("|"), } } } @@ -169,6 +171,8 @@ macro_rules! impl_operator_parse { impl OperatorExprTransformer { pub fn from_inner_vec(mut pairs: Vec>) -> Result { + impl_operator_parse!(pairs, Pipe); + impl_operator_parse!(pairs, And); impl_operator_parse!(pairs, Or); impl_operator_parse!(pairs, Gt); @@ -202,6 +206,11 @@ impl Transform for OperatorExprTransformer { let left = self .lhs .transform_value(Context::Borrowed(&context), input)?; + + if matches!(self.operator, OperatorTransformer::Pipe) { + return self.rhs.transform_value(context, &left); + } + let right = self.rhs.transform_value(context, input)?; match self.operator { @@ -396,6 +405,7 @@ impl Transform for OperatorExprTransformer { }, OperatorTransformer::Equal => Ok(Value::Bool(left == right)), OperatorTransformer::NotEqual => Ok(Value::Bool(left != right)), + OperatorTransformer::Pipe => unreachable!(), } } }