tinymist_package/pack/
tarball.rs1use super::*;
2
3pub struct TarballPack<R: ?Sized + Read> {
5 pub reader: tar::Archive<R>,
7}
8
9impl<R: Read> TarballPack<R> {
10 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> {}