Native OCaml Rego/OPA policy engine
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ocaml-rego: parse multi-statement queries

OPA test queries can be a sequence of statements separated by [;],
e.g. [data.test.a = x; data.test.b = y]. The previous [eval_query]
used [parse_expr] which only accepts a single expression, so any
test with a [;]-separated query failed to parse. Add a [query_only]
start symbol and a top-level [parse_query] that wraps it; switch
[eval_query] over to it and dispatch through [Eval.eval_body].

+18 -3
+5
lib/parser.mly
··· 52 52 53 53 %start <Ast.rego_module> rego_module 54 54 %start <Ast.expr> expr_only 55 + %start <Ast.query> query_only 55 56 56 57 %% 57 58 ··· 421 422 expr_only: 422 423 | semis e=expr semis EOF { e } 423 424 ; 425 + 426 + query_only: 427 + | semis q=query semis EOF { q } 428 + ;
+13 -3
lib/rego.ml
··· 90 90 | Lexer.Error msg -> Error (Parse_error msg) 91 91 | Parser.Error -> Error (Parse_error "syntax error") 92 92 93 + let parse_query source = 94 + let supplier = supplier source in 95 + try 96 + Ok 97 + (MenhirLib.Convert.Simplified.traditional2revised Parser.query_only 98 + supplier) 99 + with 100 + | Lexer.Error msg -> Error (Parse_error msg) 101 + | Parser.Error -> Error (Parse_error "syntax error") 102 + 93 103 (** {1 Engine} *) 94 104 95 105 type engine = { ··· 161 171 empty binding set is returned when [p] is truthy and the empty list when it 162 172 is falsy / undefined. *) 163 173 let eval_query e ~input query = 164 - match parse_expr query with 174 + match parse_query query with 165 175 | Error err -> Error err 166 - | Ok expr -> ( 176 + | Ok q -> ( 167 177 let env = make_env e ~input in 168 - try Ok (Eval.eval_body_expr env Eval.empty expr) 178 + try Ok (Eval.eval_body env Eval.empty q) 169 179 with Eval.Eval_error msg -> Error (Eval_error msg))