Skip to main content

easy_archive/archive/tar_zstd/
encode.rs

1/// TAR.ZSTD encoding implementation
2use crate::{
3    File, Fmt,
4    error::{ArchiveError, Result},
5    traits::Encode,
6};
7use std::io::Cursor;
8
9use super::TarZstd;
10
11impl Encode for TarZstd {
12    fn encode(files: Vec<File>) -> Result<Vec<u8>> {
13        let tar = Fmt::Tar.encode(files)?;
14        let mut cursor = Cursor::new(tar);
15        let mut compressed = Vec::new();
16
17        {
18            // Use compression level 6 for balanced speed/compression
19            let mut encoder = zstd::Encoder::new(&mut compressed, 6).map_err(|e| {
20                ArchiveError::CompressionError(format!("Failed to create Zstd encoder: {}", e))
21            })?;
22
23            std::io::copy(&mut cursor, &mut encoder).map_err(|e| {
24                ArchiveError::CompressionError(format!("Zstd compression failed: {}", e))
25            })?;
26
27            encoder.finish().map_err(|e| {
28                ArchiveError::CompressionError(format!("Zstd finalization failed: {}", e))
29            })?;
30        }
31
32        Ok(compressed)
33    }
34}