in guard/src/rules/evaluate.rs [724:768]
fn evaluate<'s>(&self, context: &'s PathAwareValue, var_resolver: &'s dyn EvaluationContext) -> Result<Status> {
let blk_context = format!("Block[{}]", self.location);
let mut report = AutoReport::new(
EvaluationType::BlockClause,
var_resolver,
&blk_context
);
let all = self.query.match_all;
let block_values = match resolve_query(all, &self.query.query, context, var_resolver) {
Err(Error(ErrorKind::RetrievalError(e))) |
Err(Error(ErrorKind::IncompatibleRetrievalError(e))) => {
return Ok(report.message(e).status(Status::FAIL).get_status())
},
Ok(v) => if v.is_empty() { // one or more
return Ok(report.from(Some(context.clone())).message(format!("Query {} returned no results", SliceDisplay(&self.query.query))).status(Status::FAIL)
.get_status())
} else { v },
Err(e) => return Err(e)
};
Ok(report.status(loop {
let mut num_fail = 0;
let mut num_pass = 0;
for each in block_values {
match self.block.evaluate(each, var_resolver)? {
Status::FAIL => { num_fail += 1; },
Status::SKIP => {},
Status::PASS => { num_pass += 1; }
}
}
if all {
if num_fail > 0 { break Status::FAIL }
if num_pass > 0 { break Status::PASS }
break Status::SKIP
}
else {
if num_pass > 0 { break Status::PASS }
if num_fail > 0 { break Status::FAIL }
break Status::SKIP
}
}).get_status())
}