easy_archive/archive/seven_zip/
encode.rs1use 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}