use flate2::read::GzDecoder;
use flate2::write::GzEncoder;
use flate2::Compression as Flate2Compression;
use std::io::{Read, Write};
pub trait Compression {
fn compress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error>;
fn decompress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error>;
}
pub struct NoCompression;
impl Compression for NoCompression {
fn compress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error> {
Ok(in_buffer.to_vec())
}
fn decompress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error> {
Ok(in_buffer.to_vec())
}
}
pub struct GZipCompression;
impl Compression for GZipCompression {
fn compress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error> {
let mut res = Vec::new();
let mut encoder = GzEncoder::new(&mut res, Flate2Compression::default());
encoder.write_all(in_buffer)?;
encoder.flush()?;
encoder.finish()?;
Ok(res)
}
fn decompress(&self, in_buffer: &[u8]) -> Result<Vec<u8>, std::io::Error> {
let mut res = Vec::new();
let mut decoder = GzDecoder::new(in_buffer);
decoder.read_to_end(&mut res)?;
Ok(res)
}
}