use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct HealthReport {
pub total_elements: usize,
pub container_count: usize,
pub component_count: usize,
pub total_files: usize,
pub files_planned: usize,
pub files_active: usize,
pub files_stable: usize,
pub patterns_total: usize,
pub patterns_planned: usize,
pub patterns_verified: usize,
pub per_element: Vec<ElementHealth>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElementHealth {
pub name: String,
pub c4_level: String,
pub file_count: usize,
pub files_planned: usize,
pub files_active: usize,
pub files_stable: usize,
pub pattern: String,
pub pattern_confidence: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ValidationReport {
pub ghosts: Vec<GhostEntry>,
pub orphans: Vec<OrphanEntry>,
}
impl ValidationReport {
pub fn is_clean(&self) -> bool {
self.ghosts.is_empty() && self.orphans.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GhostEntry {
pub element: String,
pub filename: String,
pub source_dir: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrphanEntry {
pub element: String,
pub filename: String,
pub source_dir: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DriftReport {
pub drifted_files: Vec<DriftedFile>,
pub missing_files: Vec<String>,
pub extra_files: Vec<String>,
}
impl DriftReport {
pub fn has_drift(&self) -> bool {
!self.drifted_files.is_empty()
|| !self.missing_files.is_empty()
|| !self.extra_files.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftedFile {
pub path: String,
pub expected_lines: usize,
pub actual_lines: usize,
}