use crate::parse::prelude::{score_languages, LanguageCompleteness};
use crate::phase::context::PhaseExecutionContext;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Phase1Summary {
pub total_files: usize,
pub parsed_files: usize,
pub parse_failures: usize,
pub signatures: usize,
pub language_distribution: HashMap<String, usize>,
pub parser_completeness: Vec<LanguageCompleteness>,
}
pub fn run(context: &PhaseExecutionContext) -> Phase1Summary {
let mut language_distribution: HashMap<String, usize> = HashMap::new();
for node_idx in context.pdg.node_indices() {
if let Some(node) = context.pdg.get_node(node_idx) {
*language_distribution
.entry(node.language.clone())
.or_insert(0) += 1;
}
}
Phase1Summary {
total_files: context.file_inventory.len(),
parsed_files: context.parse_results.len(),
parse_failures: context
.parse_results
.iter()
.filter(|r| r.is_failure())
.count(),
signatures: context
.parse_results
.iter()
.map(|r| r.signatures.len())
.sum(),
language_distribution,
parser_completeness: score_languages(&context.parse_results),
}
}