Skip to main content

easy_archive/archive/seven_zip/
encode.rs

1/// ZIP encoding implementation
2use crate::{ArchiveError, File, error::Result, traits::Encode};
3use sevenz_rust2::{ArchiveEntry, ArchiveWriter, NtTime, SourceReader};
4use std::io::Cursor;
5
6use super::SevenZip;
7
8impl Encode for SevenZip {
9    fn encode(files: Vec<File>) -> Result<Vec<u8>> {
10        let mut output = vec![];
11        let cursor = Cursor::new(&mut output);
12
13        let mut w = ArchiveWriter::new(cursor).map_err(|e| ArchiveError::EncodeFailed {
14            format: "7z".to_string(),
15            reason: format!("Failed to create ArchiveWriter: {}", e),
16        })?;
17
18        let mut entries = vec![];
19        let mut readers = vec![];
20
21        for file in files {
22            entries.push(ArchiveEntry {
23                name: file.path.replace("\\", "/"),
24                has_stream: true,
25                is_directory: file.is_dir,
26                has_last_modified_date: file.last_modified.is_some(),
27                last_modified_date: NtTime::new(file.last_modified.unwrap_or_default()),
28                ..Default::default()
29            });
30            readers.push(SourceReader::new(Cursor::new(file.buffer)));
31        }
32        w.push_archive_entries(entries, readers)
33            .map_err(|e| ArchiveError::EncodeFailed {
34                format: "7z".to_string(),
35                reason: format!("Failed to push_archive_entries: {}", e),
36            })?;
37        w.finish().map_err(|e| ArchiveError::EncodeFailed {
38            format: "7z".to_string(),
39            reason: format!("Failed to finish: {}", e),
40        })?;
41        Ok(output)
42    }
43}