Skip to main content

msg_wire/compression/
zstd.rs

1use bytes::Bytes;
2use std::io;
3use zstd::{decode_all, stream::encode_all};
4
5use super::{CompressionType, Compressor, Decompressor};
6
7pub struct ZstdCompressor {
8    level: i32,
9}
10
11impl ZstdCompressor {
12    /// Creates a new zstd compressor with the given compression level (0-9).
13    /// Default used by zstd is 3.
14    pub fn new(level: i32) -> Self {
15        Self { level }
16    }
17}
18
19impl Compressor for ZstdCompressor {
20    fn compression_type(&self) -> CompressionType {
21        CompressionType::Zstd
22    }
23
24    fn compress(&self, data: &[u8]) -> Result<Bytes, io::Error> {
25        let compressed = encode_all(data, self.level)?;
26
27        Ok(Bytes::from(compressed))
28    }
29}
30
31#[derive(Debug, Default)]
32pub struct ZstdDecompressor;
33
34impl Decompressor for ZstdDecompressor {
35    fn decompress(&self, data: &[u8]) -> Result<Bytes, io::Error> {
36        let decompressed = decode_all(data)?;
37
38        Ok(Bytes::from(decompressed))
39    }
40}