#![allow(dead_code)]
use std::path::PathBuf;
#[derive(Default, Debug)]
pub struct ParseStats {
pub total_files: usize,
pub pem_files: usize,
pub der_files: usize,
pub successful: usize,
pub failed: usize,
pub failed_files: Vec<(PathBuf, String)>,
pub total_nodes: usize,
pub rsa_certs: usize,
pub ecdsa_certs: usize,
pub eddsa_certs: usize, pub ml_dsa_certs: usize, pub dsa_certs: usize, pub other_certs: usize,
pub ml_kem_keys: usize, }
impl ParseStats {
pub fn new() -> Self {
Self::default()
}
pub fn print_summary(&self) {
println!("\n=== Summary ===");
println!("Total files: {}", self.total_files);
println!(" PEM files: {}", self.pem_files);
println!(" DER files: {}", self.der_files);
println!(
"Successfully parsed: {} ({:.1}%)",
self.successful,
100.0 * self.successful as f64 / self.total_files as f64
);
println!(
"Failed: {} ({:.1}%)",
self.failed,
100.0 * self.failed as f64 / self.total_files as f64
);
println!("\nSignature algorithms:");
println!(" RSA: {}", self.rsa_certs);
println!(" ECDSA: {}", self.ecdsa_certs);
println!(" EdDSA: {}", self.eddsa_certs);
println!(" DSA: {}", self.dsa_certs);
if self.ml_dsa_certs > 0 {
println!(" ML-DSA (PQC): {}", self.ml_dsa_certs);
}
println!(" Other: {}", self.other_certs);
if self.ml_kem_keys > 0 {
println!("\nPost-Quantum public keys:");
println!(" ML-KEM: {}", self.ml_kem_keys);
}
if self.successful > 0 {
println!("\nTotal ASN.1 nodes: {}", self.total_nodes);
println!(
"Avg nodes/cert: {:.1}",
self.total_nodes as f64 / self.successful as f64
);
}
}
pub fn print_failed_files(&self) {
if !self.failed_files.is_empty() {
println!("\n=== Failed Files ===");
for (path, error) in &self.failed_files {
println!(
" {}: {}",
path.file_name().unwrap().to_string_lossy(),
error
);
}
}
}
}