vmspect 0.2.1

Biblioteca en Rust para inspección estática, análisis y extracción de información de imágenes de disco de máquinas virtuales (VMDK, RAW, QCOW2, etc.).
use std::path::Path;
use vmspect::{inspeccionar_con_progreso, Opciones, ProgresoInspeccion};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<String> = std::env::args().collect();
    let ruta_disco = if args.len() > 1 {
        Path::new(&args[1])
    } else {
        println!("Uso: cargo run --example basic_inspection -- <ruta_a_imagen_disco>");
        println!("Ejemplo: cargo run --example basic_inspection -- disco.vmdk");
        return Ok(());
    };

    let opciones = Opciones::default();

    println!("Iniciando inspección de '{}'...", ruta_disco.display());
    let informe = inspeccionar_con_progreso(ruta_disco, &opciones, |p: ProgresoInspeccion| {
        println!(
            "[{:>3}%] {}{}",
            p.porcentaje,
            p.etapa,
            p.detalle.map(|d| format!(" - {}", d)).unwrap_or_default()
        );
    })?;

    println!("\n=== INFORME DE INSPECCIÓN ===");
    println!(
        "Formato: {} ({})",
        informe.imagen.formato,
        informe.imagen.hipervisor.nombre()
    );
    println!("Esquema de particiones: {:?}", informe.esquema);
    println!(
        "Sistema Operativo: {} {:?}",
        informe.sistema_operativo.icono(),
        informe.sistema_operativo
    );
    println!("Detalles SO: {}", informe.vm_info.os_cadena_formateada());
    if let Some(ref tools) = informe.vm_info.guest_tools {
        if tools.presente {
            println!(
                "Guest Tools: {} (Versión: {})",
                tools.tipo,
                tools.version.as_deref().unwrap_or("N/D")
            );
        }
    }
    println!("Particiones encontradas: {}", informe.particiones.len());
    for p in &informe.particiones {
        println!(
            "  - #{} [{}] {} (Inicio: 0x{:X}, Tamaño: {} bytes)",
            p.indice,
            p.tipo,
            p.sistema_archivos.nombre(),
            p.inicio,
            p.tamano
        );
    }
    println!("Programas identificados: {}", informe.programas.len());
    for prog in informe.programas.iter().take(15) {
        println!(
            "  * {} (Versión: {}, Editor: {})",
            prog.nombre,
            prog.version.as_deref().unwrap_or("N/D"),
            prog.editor.as_deref().unwrap_or("N/D")
        );
    }

    Ok(())
}