lindera_core/
compress.rs

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 lindera_decompress::decompress;
42    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}