in guard/src/commands/validate/generic_summary.rs [42:93]
fn report(&self,
writer: &mut dyn Write,
_status: Option<Status>,
failed_rules: &[&StatusContext],
passed_or_skipped: &[&StatusContext],
longest_rule_name: usize) -> crate::rules::Result<()> {
let failed = if !failed_rules.is_empty() {
let mut by_rule = HashMap::with_capacity(failed_rules.len());
for each_failed_rule in failed_rules {
for each_failed_clause in find_all_failing_clauses(each_failed_rule) {
match each_failed_clause.eval_type {
EvaluationType::Clause |
EvaluationType::BlockClause => {
if each_failed_clause.eval_type == EvaluationType::BlockClause {
match &each_failed_clause.msg {
Some(msg) => {
if msg.contains("DEFAULT") {
continue;
}
},
None => {
continue;
}
}
}
by_rule.entry(each_failed_rule.context.clone())
.or_insert(Vec::new())
.push(extract_name_info(&each_failed_rule.context, each_failed_clause)?);
}
_ => {}
}
}
}
by_rule
} else {
HashMap::new()
};
let as_vec = passed_or_skipped.iter().map(|s| *s)
.collect::<Vec<&StatusContext>>();
let (skipped, passed): (Vec<&StatusContext>, Vec<&StatusContext>) = as_vec.iter()
.partition(|status| match status.status { // This uses the dereference deep trait of Rust
Some(Status::SKIP) => true,
_ => false
});
let skipped = skipped.iter().map(|s| s.context.clone()).collect::<HashSet<String>>();
let passed = passed.iter().map(|s| s.context.clone()).collect::<HashSet<String>>();
self.renderer.report(writer, self.rules_file_name, self.data_file_name, failed, passed, skipped, longest_rule_name)?;
Ok(())
}