anyreader-walker 0.2.1

A library for reading streams of compressed and uncompressed data without knowing the format in advance
Documentation
use crate::EntryDetails;
use crate::entry::FileEntry;
use crate::stack::AnyWalker;
use anyreader::FormatKind;
use anyreader::test::{assert_data_equal_with_msg, read_vec};
use std::io::Read;
use std::path::PathBuf;

pub const TEST_DATA: &[u8] = b"hello world";

#[derive(Debug, Default)]
pub struct TestVisitor {
    data: Vec<(FormatKind, PathBuf, Vec<u8>)>,
}

impl TestVisitor {
    pub fn into_data(self) -> Vec<(FormatKind, PathBuf, Vec<u8>)> {
        self.data
    }
}

impl AnyWalker for TestVisitor {
    fn visit_file_entry(&mut self, entry: &mut FileEntry<impl Read>) -> std::io::Result<()> {
        let kind = entry.format();
        let path = entry.path().to_path_buf();
        let data = read_vec(entry);
        self.data.push((kind, path, data));
        Ok(())
    }

    fn begin_visit_archive(
        &mut self,
        _details: &EntryDetails,
        _format: FormatKind,
    ) -> std::io::Result<bool> {
        Ok(true)
    }
}

pub fn assert_visitor_equal(
    expected: Vec<(FormatKind, PathBuf, Vec<u8>)>,
    found: Vec<(FormatKind, PathBuf, Vec<u8>)>,
) {
    assert_eq!(expected.len(), found.len());
    for (idx, (e_kind, e_path, e_data)) in expected.iter().enumerate() {
        let (f_kind, f_path, f_data) = &found[idx];
        assert_eq!((e_kind, e_path), (f_kind, f_path), "Index {idx}");
        assert_data_equal_with_msg(e_data, f_data, format!("Index {idx}"));
    }
}