use std::io::{Read as _, Write as _};
use flate2::Compression;
use flate2::read::GzDecoder;
use flate2::write::GzEncoder;
use crate::Result;
const CHUNK_SIZE: usize = 16 * 1024;
#[must_use]
pub fn gzip(data: &[u8], max_size: Option<usize>) -> Option<Vec<u8>> {
let limit = max_size.unwrap_or(usize::MAX);
let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
for chunk in data.chunks(CHUNK_SIZE) {
encoder.write_all(chunk).ok()?;
if encoder.get_ref().len() > limit {
return None;
}
}
let out = encoder.finish().ok()?;
(out.len() <= limit).then_some(out)
}
pub fn gunzip(data: &[u8]) -> Result<Vec<u8>> {
let mut out = Vec::new();
GzDecoder::new(data).read_to_end(&mut out)?;
Ok(out)
}