use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use crate::model::resolver_coverage::ResolverClass;
use crate::model::verdict::Reason;
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct TargetFindings {
pub reasons: Vec<Reason>,
}
impl TargetFindings {
#[must_use]
pub fn is_empty(&self) -> bool {
self.reasons.is_empty()
}
#[must_use]
pub fn by_class(&self) -> Vec<(ResolverClass, usize)> {
let mut counts: BTreeMap<ResolverClass, usize> = BTreeMap::new();
for reason in &self.reasons {
if let Some(class) = reason.resolver_class() {
*counts.entry(class).or_insert(0) += 1;
}
}
counts.into_iter().collect()
}
#[must_use]
pub fn unclassified(&self) -> usize {
self.reasons
.iter()
.filter(|r| r.resolver_class().is_none())
.count()
}
#[must_use]
pub fn blocking(&self) -> bool {
self.reasons.iter().any(Reason::is_blocking)
}
}