cas_lib/compression/
zstd.rs

1use std::{io::Cursor, sync::mpsc};
2
3/// Compresses data using Zstandard compression algorithm.
4/// The `level` parameter controls the compression level (0-22).
5/// Higher levels result in better compression but slower performance.
6pub fn compress(data_to_compress: Vec<u8>, level: i32) -> Vec<u8> {
7    let cursor = Cursor::new(data_to_compress);
8    let mut compressed_data = Vec::new();
9    zstd::stream::copy_encode(cursor, &mut compressed_data, level).unwrap();
10    compressed_data
11}
12
13/// Compresses data using Zstandard compression algorithm on the threadpool.
14/// The `level` parameter controls the compression level (0-22).
15/// Higher levels result in better compression but slower performance.
16pub fn compress_threadpool(data_to_compress: Vec<u8>, level: i32) -> Vec<u8> {
17    let (sender, receiver) = mpsc::channel();
18    rayon::spawn(move || {
19        let compressed_data = compress(data_to_compress, level);
20        sender.send(compressed_data).unwrap();
21    });
22    let result = receiver.recv().unwrap();
23    result
24}
25
26/// Decompresses data using Zstandard decompression algorithm.
27pub fn decompress(data_to_decompress: Vec<u8>) -> Vec<u8> {
28    let mut cursor = Cursor::new(data_to_decompress);
29    let mut decompressed_data = Vec::new();
30    zstd::stream::copy_decode(&mut cursor, &mut decompressed_data).unwrap();
31    decompressed_data
32}
33
34/// Decompresses data using Zstandard decompression algorithm on the threadpool.
35pub fn decompress_threadpool(data_to_decompress: Vec<u8>) -> Vec<u8> {
36    let (sender, receiver) = mpsc::channel();
37        rayon::spawn(move || {
38            let decompressed_data = decompress(data_to_decompress);
39            sender.send(decompressed_data).unwrap();
40        });
41        let result = receiver.recv().unwrap();
42        result
43}