mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Improvements (#33)
1. Skip recording undefined variables 2. Parse `in` correctly if it is not imported. 3. base64.decode 4. Handle `with` modifier for qualified data and input. Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
GitHub
parent
6228eaab4a
commit
c53d002347
@@ -181,18 +181,14 @@ pub fn check_output(computed_results: &[Value], expected_results: &[Value]) -> R
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn query_results_to_value(query_results: QueryResults) -> Result<Value> {
|
||||
fn push_query_results(query_results: QueryResults, results: &mut Vec<Value>) {
|
||||
if let Some(query_result) = query_results.result.last() {
|
||||
if !query_result.bindings.is_empty_object() {
|
||||
return Ok(query_result.bindings.clone());
|
||||
} else {
|
||||
return match query_result.expressions.last() {
|
||||
Some(v) => Ok(v["value"].clone()),
|
||||
_ => bail!("no expressions in query results"),
|
||||
};
|
||||
results.push(query_result.bindings.clone());
|
||||
} else if let Some(v) = query_result.expressions.last() {
|
||||
results.push(v["value"].clone());
|
||||
}
|
||||
}
|
||||
bail!("query result incomplete")
|
||||
}
|
||||
|
||||
pub fn eval_file_first_rule(
|
||||
@@ -268,22 +264,20 @@ pub fn eval_file_first_rule(
|
||||
}
|
||||
|
||||
// Now eval the query.
|
||||
results.push(query_results_to_value(interpreter.eval_user_query(
|
||||
&query_node,
|
||||
&query_schedule,
|
||||
enable_tracing,
|
||||
)?)?);
|
||||
push_query_results(
|
||||
interpreter.eval_user_query(&query_node, &query_schedule, enable_tracing)?,
|
||||
&mut results,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// it no input is defined then one evaluation of all modules is performed
|
||||
interpreter.eval(&data_opt, &None, enable_tracing, Some(schedule))?;
|
||||
|
||||
// Now eval the query.
|
||||
results.push(query_results_to_value(interpreter.eval_user_query(
|
||||
&query_node,
|
||||
&query_schedule,
|
||||
enable_tracing,
|
||||
)?)?);
|
||||
// Now eval the query
|
||||
push_query_results(
|
||||
interpreter.eval_user_query(&query_node, &query_schedule, enable_tracing)?,
|
||||
&mut results,
|
||||
);
|
||||
}
|
||||
|
||||
Ok(results)
|
||||
@@ -359,22 +353,20 @@ pub fn eval_file(
|
||||
interpreter.eval_modules(&Some(input), enable_tracing)?;
|
||||
|
||||
// Now eval the query.
|
||||
results.push(query_results_to_value(interpreter.eval_user_query(
|
||||
&query_node,
|
||||
&query_schedule,
|
||||
enable_tracing,
|
||||
)?)?);
|
||||
push_query_results(
|
||||
interpreter.eval_user_query(&query_node, &query_schedule, enable_tracing)?,
|
||||
&mut results,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// it no input is defined then one evaluation of all modules is performed
|
||||
interpreter.eval(&data_opt, &None, enable_tracing, Some(schedule))?;
|
||||
|
||||
// Now eval the query.
|
||||
results.push(query_results_to_value(interpreter.eval_user_query(
|
||||
&query_node,
|
||||
&query_schedule,
|
||||
enable_tracing,
|
||||
)?)?);
|
||||
push_query_results(
|
||||
interpreter.eval_user_query(&query_node, &query_schedule, enable_tracing)?,
|
||||
&mut results,
|
||||
);
|
||||
}
|
||||
|
||||
Ok(results)
|
||||
|
||||
@@ -134,6 +134,7 @@ cases:
|
||||
- note: same-line
|
||||
rego: |
|
||||
package test
|
||||
import future.keywords.in
|
||||
x = y{
|
||||
some a b in {4, 5}
|
||||
[1, 2, 3][a] == 3
|
||||
|
||||
Reference in New Issue
Block a user