lib3mf_core/archive/
zip_archive.rs1use crate::archive::ArchiveReader;
2use crate::error::{Lib3mfError, Result};
3use std::io::{Read, Seek};
4use zip::ZipArchive;
5
6#[derive(Debug)]
11pub struct ZipArchiver<R> {
12 archive: ZipArchive<R>,
13}
14
15impl<R: Read + Seek> ZipArchiver<R> {
16 pub fn new(reader: R) -> Result<Self> {
18 Ok(Self {
19 archive: ZipArchive::new(reader).map_err(|e| Lib3mfError::Io(e.into()))?,
20 })
21 }
22}
23
24impl<R: Read + Seek> Read for ZipArchiver<R> {
25 fn read(&mut self, _buf: &mut [u8]) -> std::io::Result<usize> {
26 Ok(0)
37 }
38}
39
40impl<R: Read + Seek> Seek for ZipArchiver<R> {
41 fn seek(&mut self, _pos: std::io::SeekFrom) -> std::io::Result<u64> {
42 Ok(0)
43 }
44}
45
46impl<R: Read + Seek> ArchiveReader for ZipArchiver<R> {
47 fn read_entry(&mut self, name: &str) -> Result<Vec<u8>> {
48 let name = name.trim_start_matches('/');
49 let mut file = self.archive.by_name(name).map_err(|_| {
50 Lib3mfError::Io(std::io::Error::new(std::io::ErrorKind::NotFound, name))
51 })?;
52
53 let mut buffer = Vec::new();
54 file.read_to_end(&mut buffer)?;
55 Ok(buffer)
56 }
57
58 fn entry_exists(&mut self, name: &str) -> bool {
59 let name = name.trim_start_matches('/');
60 self.archive.by_name(name).is_ok()
61 }
62
63 fn list_entries(&mut self) -> Result<Vec<String>> {
64 Ok(self.archive.file_names().map(|s| s.to_string()).collect())
65 }
66}