Skip to content

Commit

Permalink
Make unary - operator OPA compatible. (microsoft#175)
Browse files Browse the repository at this point in the history
OPA supports unary - operator only in the following cases:
-\s+numeric literal

We match OPAs behavior for now. This can be revisited later.
  • Loading branch information
anakrish authored Mar 10, 2024
1 parent 08f3007 commit 7bc9a50
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2699,7 +2699,22 @@ impl Interpreter {
key, value, query, ..
} => self.eval_object_compr(key, value, query),
Expr::SetCompr { term, query, .. } => self.eval_set_compr(term, query),
Expr::UnaryExpr { .. } => unimplemented!("unar expr is umplemented"),
Expr::UnaryExpr { span, expr: uexpr } => match uexpr.as_ref() {
Expr::Number(_) if !uexpr.span().text().starts_with('-') => {
builtins::numbers::arithmetic_operation(
span,
&ArithOp::Sub,
expr,
uexpr,
Value::from(0),
self.eval_expr(uexpr)?,
self.strict_builtin_errors,
)
}
_ => bail!(expr
.span()
.error("unary - can only be used with numeric literals")),
},
Expr::Call { span, fcn, params } => {
self.eval_call(span, expr, fcn, params, None, false)
}
Expand Down
46 changes: 46 additions & 0 deletions tests/interpreter/cases/unary/tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
cases:
- note: unary expr on non literals produces an error
modules:
- |
package test
x = - y
y = 1
query: data.test
error: "unary - can only be used with numeric literals"

- note: unary expr on literals work
modules:
- |
package test
x = - 1 # With space
y = -1
z = - # With newlines and comment
1
query: data.test
want_result:
x: -1
y: -1
z: -1

- note: double unary expr
modules:
- |
package test
x = - -1
query: data.test
error: "unary - can only be used with numeric literals"

- note: double unary expr double space
modules:
- |
package test
x = - - 1
query: data.test
error: "unary - can only be used with numeric literals"

0 comments on commit 7bc9a50

Please sign in to comment.