vmspect 0.8.0

Blazing-fast static inspection, forensic analysis and information extraction library for virtual machine disk images (VMDK, RAW, QCOW2, VHD, VHDX, VDI).
use std::path::PathBuf;
use std::sync::Arc;
use std::time::Duration;
use vmspect::{InspectionEngine, Options};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let images = std::env::args_os()
        .skip(1)
        .map(PathBuf::from)
        .collect::<Vec<_>>();
    if images.is_empty() {
        println!("Usage: cargo run --example batch_polling -- <disk_image> [disk_image ...]");
        return Ok(());
    }

    let engine = Arc::new(InspectionEngine::new(Options::default()));
    let progress = engine.progress();

    let worker_engine = Arc::clone(&engine);
    let handle = std::thread::spawn(move || worker_engine.inspect_batch(images, 2));

    loop {
        let snapshot = progress.snapshot();
        let percentage = progress.completion_percentage();
        let completed = progress.completed_tasks();
        let total = progress.total_tasks();

        println!("[{percentage:>5.1}%] {completed}/{total}");
        if handle.is_finished()
            || (snapshot.total_tasks > 0 && snapshot.completed_tasks >= snapshot.total_tasks)
        {
            break;
        }

        std::thread::sleep(Duration::from_millis(500));
    }

    let result = handle.join().expect("worker thread panicked")?;
    let snapshot = progress.snapshot();
    println!(
        "Finished at {}%: {} reports, {} image errors",
        snapshot.percentage,
        result.reports.len(),
        result.errors.len()
    );
    Ok(())
}