1use flate2::write::{ZlibDecoder, ZlibEncoder};
2use flate2::Compression;
3use std::cmp::Ordering;
4use std::io;
5use std::io::Write;
6
7use thiserror::Error;
8
9#[derive(Error, Debug)]
10pub enum ZlibDecompressionError {
11 #[error("Io: {0}")]
12 Io(#[from] io::Error),
13 #[error("Decompressed data is larger than advertised")]
14 TooBig,
15 #[error("Decompressed data is smaller than advertised")]
16 TooSmall,
17}
18
19pub fn decompress(data: &[u8], expected_size: usize) -> Result<Vec<u8>, ZlibDecompressionError> {
20 let mut decoder = ZlibDecoder::new(Vec::new());
21 decoder.write_all(data)?;
22 let decompressed = decoder.finish()?;
23 match decompressed.len().cmp(&expected_size) {
24 Ordering::Less => Err(ZlibDecompressionError::TooSmall),
25 Ordering::Greater => Err(ZlibDecompressionError::TooBig),
26 Ordering::Equal => Ok(decompressed),
27 }
28}
29
30pub fn compress(data: &[u8]) -> Vec<u8> {
31 let mut encoder = ZlibEncoder::new(Vec::new(), Compression::new(9));
32 encoder.write_all(data).unwrap();
33 encoder.finish().unwrap()
34}