#[derive(Debug, Clone)]
pub struct ValidationCheck {
pub id: u8,
pub name: String,
pub passed: bool,
pub message: String,
pub category: char,
}
impl ValidationCheck {
pub(crate) fn pass(id: u8, category: char, name: &str, message: &str) -> Self {
Self {
id,
name: name.to_string(),
passed: true,
message: message.to_string(),
category,
}
}
pub(crate) fn fail(id: u8, category: char, name: &str, message: &str) -> Self {
Self {
id,
name: name.to_string(),
passed: false,
message: message.to_string(),
category,
}
}
}
#[derive(Debug)]
pub struct ValidationReport {
pub checks: Vec<ValidationCheck>,
pub score: u8,
pub max_score: u8,
pub passed: bool,
pub critical_failures: Vec<String>,
}
impl ValidationReport {
pub(crate) fn from_checks(
checks: Vec<ValidationCheck>,
critical_failures: Vec<String>,
) -> Self {
let score = checks.iter().filter(|c| c.passed).count() as u8;
let max_score = checks.len() as u8;
let passed = score >= 23 && critical_failures.is_empty();
Self {
checks,
score,
max_score,
passed,
critical_failures,
}
}
#[must_use]
pub fn checks_by_category(&self, category: char) -> Vec<&ValidationCheck> {
self.checks
.iter()
.filter(|c| c.category == category)
.collect()
}
}