synta 0.2.3

ASN.1 parser, decoder, and encoder library with DER/BER support and C FFI
Documentation
//! Statistics collection for certificate parsing

#![allow(dead_code)]

use std::path::PathBuf;

/// Statistics for parsing results
#[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,  // Ed25519, Ed448
    pub ml_dsa_certs: usize, // ML-DSA (post-quantum)
    pub dsa_certs: usize,    // Traditional DSA
    pub other_certs: usize,
    pub ml_kem_keys: usize, // ML-KEM public keys (post-quantum)
}

impl ParseStats {
    /// Create a new empty statistics collection
    pub fn new() -> Self {
        Self::default()
    }

    /// Print summary statistics
    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
            );
        }
    }

    /// Print failed files
    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
                );
            }
        }
    }
}