use std::collections::HashMap;
use std::path::PathBuf;
use crate::deploy::pod::PodPartition;
use crate::graph::{CodeGraph, NodeData};
use crate::model::{FileExtraction, FileId};
#[derive(Debug, Clone, serde::Serialize)]
pub struct FileMetrics {
pub ast_node_count: usize,
pub symbol_count: usize,
pub import_count: usize,
pub reference_count: usize,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct PodMetrics {
pub total_ast_nodes: usize,
pub file_count: usize,
pub symbol_count: usize,
}
pub fn compute_file_metrics<F>(extractions: &[F]) -> HashMap<PathBuf, FileMetrics>
where
F: std::borrow::Borrow<FileExtraction>,
{
let mut metrics = HashMap::new();
for file in extractions {
let file = file.borrow();
metrics.insert(
file.path.clone(),
FileMetrics {
ast_node_count: file.ast_node_count,
symbol_count: file.symbols.len(),
import_count: file.imports.len(),
reference_count: file.references.len(),
},
);
}
metrics
}
pub fn compute_pod_metrics(
partition: &PodPartition,
file_metrics: &HashMap<PathBuf, FileMetrics>,
graph: &CodeGraph,
) -> Vec<PodMetrics> {
let mut fid_to_path: HashMap<FileId, PathBuf> = HashMap::new();
for (&fid, &idx) in &graph.file_to_index {
if let Some(NodeData::File(f)) = graph.graph().node_weight(idx) {
fid_to_path.insert(fid, f.path.clone());
}
}
let mut pod_metrics = Vec::with_capacity(partition.pods.len());
for pod in &partition.pods {
let mut total_ast_nodes = 0usize;
let file_count = pod.files.len();
let mut symbol_count = 0usize;
for &fid in &pod.files {
if let Some(path) = fid_to_path.get(&fid)
&& let Some(fm) = file_metrics.get(path)
{
total_ast_nodes += fm.ast_node_count;
symbol_count += fm.symbol_count;
}
}
pod_metrics.push(PodMetrics {
total_ast_nodes,
file_count,
symbol_count,
});
}
pod_metrics
}