twmap/
compression.rs

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}