znippy-decompress 0.9.5

Decompress logic for Znippy, a parallel chunked compression system.
use anyhow::Result;
use std::path::Path;
use znippy_common::{IndexFilter, VerifyReport};

pub fn decompress_archive(archive_path: &Path, output_dir: &Path) -> Result<VerifyReport> {
    let report = znippy_common::decompress_archive(archive_path, true, output_dir)?;
    // test-matrix emit: HONEST read-path verdict — green ONLY when every file
    // reconstructed and blake3-verified (zero corrupt files).
    #[cfg(feature = "testmatrix")]
    crate::functional_status(
        "znippy-decompress/extract",
        "decompress_archive",
        report.corrupt_files == 0,
        &format!(
            "files={} verified={} corrupt={} chunks={}",
            report.total_files, report.verified_files, report.corrupt_files, report.chunks
        ),
    );
    Ok(report)
}

/// Selective extract: reconstruct only the files whose `(pkg_type, repo)`
/// sub-index matches `filter`. An empty filter equals [`decompress_archive`].
pub fn decompress_archive_filtered(
    archive_path: &Path,
    output_dir: &Path,
    filter: &IndexFilter,
) -> Result<VerifyReport> {
    let report =
        znippy_common::decompress_archive_filtered(archive_path, true, output_dir, filter)?;
    // test-matrix emit: HONEST verdict for the selective (filtered) extract.
    #[cfg(feature = "testmatrix")]
    crate::functional_status(
        "znippy-decompress/extract",
        "decompress_archive_filtered",
        report.corrupt_files == 0,
        &format!(
            "files={} verified={} corrupt={} chunks={}",
            report.total_files, report.verified_files, report.corrupt_files, report.chunks
        ),
    );
    Ok(report)
}