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:
Anand Krishnamoorthi
2023-11-01 21:57:06 -07:00
committed by GitHub
parent 6228eaab4a
commit c53d002347
8 changed files with 149 additions and 83 deletions

View File

@@ -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)

View File

@@ -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