tinymist_package/pack/
tarball.rs

1use super::*;
2
3/// A package in the tarball.
4pub struct TarballPack<R: ?Sized + Read> {
5    /// The holder for the tarball.
6    pub reader: tar::Archive<R>,
7}
8
9impl<R: Read> TarballPack<R> {
10    /// Creates a new `TarballPack` instance.
11    pub fn new(reader: R) -> Self {
12        let reader = tar::Archive::new(reader);
13        Self { reader }
14    }
15}
16
17impl<R: ?Sized + Read> fmt::Debug for TarballPack<R> {
18    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19        f.debug_struct("TarballPack").finish()
20    }
21}
22
23impl<R: Read> PackFs for TarballPack<R> {
24    fn read_all(
25        &mut self,
26        f: &mut (dyn FnMut(&str, PackFile) -> PackageResult<()> + Send + Sync),
27    ) -> PackageResult<()> {
28        for entry in self.reader.entries().map_err(malform)? {
29            let entry = entry.map_err(malform)?;
30            let header = entry.header();
31
32            let is_file = header.entry_type().is_file();
33            if !is_file {
34                continue;
35            }
36
37            let path = header.path().map_err(malform)?;
38            let path = path.to_string_lossy().to_string();
39
40            let pack_file = PackFile::Read(Box::new(entry));
41            f(&path, pack_file)?;
42        }
43
44        Ok(())
45    }
46}
47
48impl<R: Read> Pack for TarballPack<R> {}
49impl<R: Read> PackExt for TarballPack<R> {}