use super::error::{Error, Result};
use brotli_decompressor::Decompressor;
use bytes::Bytes;
use flate2::read::GzDecoder;
use zstd::Decoder;
fn decompress_gzip(data: &[u8]) -> Result<Bytes> {
let mut decoder = GzDecoder::new(data);
let mut decompressed = Vec::new();
std::io::Read::read_to_end(&mut decoder, &mut decompressed).map_err(|e| Error::Common {
category: "gzip".to_string(),
message: format!("Failed to decompress gzip data: {e}"),
})?;
Ok(Bytes::from(decompressed))
}
fn decompress_brotli(data: &[u8]) -> Result<Bytes> {
let mut decompressor = Decompressor::new(data, 4096);
let mut decompressed = Vec::new();
std::io::Read::read_to_end(&mut decompressor, &mut decompressed).map_err(|e| {
Error::Common {
category: "brotli".to_string(),
message: format!("Failed to decompress brotli data: {e}"),
}
})?;
Ok(Bytes::from(decompressed))
}
fn decompress_zstd(data: &[u8]) -> Result<Bytes> {
let mut decompressor = Decoder::new(data).map_err(|e| Error::Common {
category: "zstd".to_string(),
message: format!("Failed to create zstd decoder: {e}"),
})?;
let mut decompressed = Vec::new();
std::io::Read::read_to_end(&mut decompressor, &mut decompressed).map_err(|e| {
Error::Common {
category: "zstd".to_string(),
message: format!("Failed to decompress zstd data: {e}"),
}
})?;
Ok(Bytes::from(decompressed))
}
pub fn decompress(encoding: &str, data: &Bytes) -> Result<Bytes> {
match encoding {
"gzip" => decompress_gzip(data),
"br" => decompress_brotli(data),
"zstd" => decompress_zstd(data),
_ => Ok(data.clone()),
}
}