ewf-forensic 0.2.1

Forensic integrity analysis and repair for EWF (Expert Witness Format / E01) images
Documentation
use ewf_forensic::{EwfIntegrity, Severity};
use std::process;

fn main() {
    let paths: Vec<String> = std::env::args().skip(1).collect();
    if paths.is_empty() {
        eprintln!("usage: validate <image.E01> [image2.E01 ...]");
        process::exit(1);
    }

    let mut any_error = false;

    for path in &paths {
        let data = match std::fs::read(path) {
            Ok(d) => d,
            Err(e) => {
                eprintln!("[SKIP] {path}: {e}");
                continue;
            }
        };

        let findings = EwfIntegrity::new(&data).analyse();
        let size_kb = data.len() / 1024;

        if findings.is_empty() {
            println!("[CLEAN]  {path}  ({size_kb} KB) — no anomalies");
        } else {
            for a in &findings {
                let tag = match a.severity() {
                    Severity::Critical => "[CRIT ]",
                    Severity::Error => "[ERROR]",
                    Severity::Warning => "[WARN ]",
                    Severity::Info => "[INFO ]",
                };
                println!("{tag}  {path}  ({size_kb} KB)  {a:?}");
            }
            let has_error = findings
                .iter()
                .any(|a| matches!(a.severity(), Severity::Critical | Severity::Error));
            if has_error {
                any_error = true;
            }
        }
    }

    if any_error {
        process::exit(1);
    }
}