use serde::{Deserialize, Serialize};
use super::component::ComponentQuality;
use super::types::QualityGrade;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QualitySummary {
pub total_components: usize,
pub a_plus_count: usize,
pub a_count: usize,
pub a_minus_count: usize,
pub below_threshold_count: usize,
pub missing_hero_count: usize,
pub avg_rust_score: f64,
pub avg_repo_score: f64,
pub avg_readme_score: f64,
}
impl QualitySummary {
pub fn from_components(components: &[ComponentQuality]) -> Self {
let total = components.len();
if total == 0 {
return Self {
total_components: 0,
a_plus_count: 0,
a_count: 0,
a_minus_count: 0,
below_threshold_count: 0,
missing_hero_count: 0,
avg_rust_score: 0.0,
avg_repo_score: 0.0,
avg_readme_score: 0.0,
};
}
let a_plus_count = components.iter().filter(|c| c.grade == QualityGrade::APlus).count();
let a_count = components.iter().filter(|c| c.grade == QualityGrade::A).count();
let a_minus_count = components.iter().filter(|c| c.grade == QualityGrade::AMinus).count();
let below_threshold_count =
components.iter().filter(|c| !c.grade.is_release_ready()).count();
let missing_hero_count = components.iter().filter(|c| !c.hero_image.valid).count();
let avg_rust_score =
components.iter().map(|c| c.rust_score.value as f64).sum::<f64>() / total as f64;
let avg_repo_score =
components.iter().map(|c| c.repo_score.value as f64).sum::<f64>() / total as f64;
let avg_readme_score =
components.iter().map(|c| c.readme_score.value as f64).sum::<f64>() / total as f64;
Self {
total_components: total,
a_plus_count,
a_count,
a_minus_count,
below_threshold_count,
missing_hero_count,
avg_rust_score,
avg_repo_score,
avg_readme_score,
}
}
}