libpna 0.33.0

PNA(Portable-Network-Archive) decoding and encoding library
Documentation
use libpna::{Archive, DataKind, ReadOptions};
use std::io;

fn extract_all(follows: &[&[u8]], password: Option<&str>) {
    let mut idx = 0;
    let mut archive_reader = Archive::read_header(follows[idx]).unwrap();
    loop {
        idx += 1;
        for entry in archive_reader.entries().skip_solid() {
            let item = entry.unwrap();
            if item.header().data_kind() == DataKind::Directory {
                continue;
            }
            let path = item.header().path().to_string();
            let mut dist = Vec::new();
            let mut reader = item.reader(ReadOptions::with_password(password)).unwrap();
            io::copy(&mut reader, &mut dist).unwrap();
            match &*path {
                "multipart_test.txt" => assert_eq!(
                    dist.as_slice(),
                    include_bytes!("../../resources/test/multipart_test.txt")
                ),
                a => panic!("Unexpected entry name {a}"),
            }
        }
        if archive_reader.has_next_archive() {
            archive_reader = archive_reader.read_next_archive(follows[idx]).unwrap();
        } else {
            break;
        }
    }
}

#[test]
fn extract_multipart_archive() {
    extract_all(
        &[
            include_bytes!("../../resources/test/multipart.part1.pna"),
            include_bytes!("../../resources/test/multipart.part2.pna"),
        ],
        None,
    );
}