use std::collections::HashMap;
use crate::rules::{NamedStatus, RecordType, Status};
pub mod generic;
pub mod structured;
pub(crate) fn get_by_rules<'top>(
top: &'top crate::rules::eval_context::EventRecord<'_>,
) -> HashMap<&'top str, Vec<&'top Option<RecordType<'top>>>> {
top.children.iter().fold(HashMap::new(), |mut acc, rule| {
if let Some(RecordType::RuleCheck(NamedStatus { name, .. })) = rule.container {
acc.entry(name).or_default().push(&rule.container)
}
acc
})
}
pub(crate) fn get_status_result(
expected: Status,
rule: Vec<&Option<RecordType<'_>>>,
) -> (Option<Status>, Vec<Status>) {
let mut statuses: Vec<Status> = Vec::with_capacity(rule.len());
let mut all_skipped = 0;
for each in rule.iter().copied().flatten() {
if let RecordType::RuleCheck(NamedStatus {
status: got_status, ..
}) = each
{
match expected {
Status::SKIP => {
if *got_status == Status::SKIP {
all_skipped += 1;
}
}
rest => {
if *got_status == rest {
return (Some(expected), statuses);
}
}
}
statuses.push(*got_status)
}
}
if expected == Status::SKIP && all_skipped == rule.len() {
return (Some(expected), statuses);
}
(None, statuses)
}