Skip to main content

easy_archive/archive/tar_gz/
encode.rs

1/// TAR.GZ encoding implementation
2use crate::{
3    File, Fmt,
4    error::{ArchiveError, Result},
5    traits::Encode,
6};
7use flate2::{Compression, bufread::GzEncoder};
8use std::io::{Cursor, Read};
9
10use super::TarGz;
11
12impl Encode for TarGz {
13    fn encode(files: Vec<File>) -> Result<Vec<u8>> {
14        let tar = Fmt::Tar.encode(files)?;
15
16        // Pre-allocate compressed buffer (estimate 30-40% of original size)
17        let estimated_size = tar.len() / 3;
18        let mut cursor = Cursor::new(tar);
19
20        // Use default compression level (6) for balanced speed/compression
21        let mut encoder = GzEncoder::new(&mut cursor, Compression::default());
22        let mut compressed = Vec::with_capacity(estimated_size);
23
24        encoder
25            .read_to_end(&mut compressed)
26            .map_err(|e| ArchiveError::CompressionError(format!("GZ compression failed: {}", e)))?;
27
28        Ok(compressed)
29    }
30}