1use std::io::Write;
2
3use flate2::write::{DeflateEncoder, GzEncoder, ZlibEncoder};
4use flate2::Compression;
5
6use crate::decompress::{Algorithm, CompressedData};
7
8#[allow(dead_code)]
9fn algorithm_compression_ratio_estimation() -> f64 {
10 unimplemented!()
11}
12
13pub fn compress(data: &[u8], algorithm: Algorithm) -> anyhow::Result<CompressedData> {
14 match algorithm {
15 Algorithm::Deflate => {
16 let mut e = DeflateEncoder::new(Vec::new(), Compression::default());
17 e.write_all(data)?;
18
19 Ok(CompressedData::new(algorithm, e.finish()?))
20 }
21 Algorithm::Zlib => {
22 let mut e = ZlibEncoder::new(Vec::new(), Compression::default());
23 e.write_all(data)?;
24
25 Ok(CompressedData::new(algorithm, e.finish()?))
26 }
27 Algorithm::Gzip => {
28 let mut e = GzEncoder::new(Vec::new(), Compression::default());
29 e.write_all(data)?;
30 Ok(CompressedData::new(algorithm, e.finish()?))
31 }
32 Algorithm::Raw => Ok(CompressedData::new(algorithm, data.to_vec())),
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use crate::decompress::decompress;
39
40 use super::*;
41 use rand::prelude::*;
43
44 #[test]
45 fn compress_decompress() {
46 let mut rng = rand::thread_rng();
47 let mut buf = Vec::new();
48
49 for _i in 0..10000 {
50 buf.push(rng.gen())
51 }
52 for _i in 0..10000 {
53 buf.push(0)
54 }
55
56 let compress_data = compress(&buf, Algorithm::Deflate).unwrap();
57
58 let data = decompress(compress_data).unwrap();
59
60 assert_eq!(&buf, &data);
61 }
62}