use flate2::{read::ZlibDecoder, write::ZlibEncoder, Compression};
use std::io::{Read, Write};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum CompressionError {
#[error("Compression I/O error: {0}")]
Io(#[from] std::io::Error),
}
impl From<CompressionError> for crate::packet::PacketError {
fn from(e: CompressionError) -> Self {
crate::packet::PacketError::Io(std::io::Error::new(
std::io::ErrorKind::Other,
e.to_string(),
))
}
}
pub fn compress_zlib(data: &[u8]) -> Result<Vec<u8>, CompressionError> {
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default());
encoder.write_all(data)?;
Ok(encoder.finish()?)
}
pub fn compress_zlib_level(data: &[u8], level: u32) -> Result<Vec<u8>, CompressionError> {
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::new(level));
encoder.write_all(data)?;
Ok(encoder.finish()?)
}
pub fn decompress_zlib(data: &[u8]) -> Result<Vec<u8>, CompressionError> {
let mut decoder = ZlibDecoder::new(data);
let mut output = Vec::new();
decoder.read_to_end(&mut output)?;
Ok(output)
}