anyreader_walker/
stack.rs

1use crate::entry::{EntryDetails, FileEntry};
2use crate::walkers::ArchiveVisitor;
3use anyreader::FormatKind;
4use std::io::Read;
5
6#[allow(unused_variables)]
7pub trait AnyWalker: Sized {
8    fn visit_file_entry(&mut self, entry: &mut FileEntry<impl Read>) -> std::io::Result<()>;
9
10    fn begin_visit_archive(
11        &mut self,
12        details: &EntryDetails,
13        format: FormatKind,
14    ) -> std::io::Result<bool> {
15        Ok(true)
16    }
17
18    fn end_visit_archive(
19        &mut self,
20        details: EntryDetails,
21        format: FormatKind,
22    ) -> std::io::Result<()> {
23        Ok(())
24    }
25
26    fn walk(&mut self, mut entry: FileEntry<impl Read>) -> std::io::Result<()> {
27        if entry.supports_recursion()
28            && self.begin_visit_archive(entry.details(), entry.format())?
29        {
30            let details = entry.details().clone();
31            let format = entry.format();
32            entry.visit(self)?;
33            self.end_visit_archive(details, format)?;
34            Ok(())
35        } else {
36            self.visit_file_entry(&mut entry)?;
37            Ok(())
38        }
39    }
40}