Skip to main content

photon_protocol/compressor/
zstd.rs

1use bytes::BytesMut;
2
3use crate::ports::compress::{CompressionError, Compressor};
4
5#[derive(Clone)]
6pub struct ZstdCompressor {
7    level: i32,
8}
9
10impl ZstdCompressor {
11    pub fn new(level: i32) -> Self {
12        Self { level }
13    }
14}
15
16impl Default for ZstdCompressor {
17    fn default() -> Self {
18        Self { level: 3 }
19    }
20}
21
22impl Compressor for ZstdCompressor {
23    fn compress(&self, input: &[u8], output: &mut BytesMut) -> Result<(), CompressionError> {
24        let compressed = zstd::encode_all(input, self.level)
25            .map_err(|e| CompressionError::Unknown(e.into()))?;
26
27        output.extend_from_slice(&compressed);
28        Ok(())
29    }
30
31    fn decompress(&self, input: &[u8], output: &mut BytesMut) -> Result<(), CompressionError> {
32        let decompressed = zstd::decode_all(input)
33            .map_err(|_| CompressionError::CorruptPayload {
34                compressor_name: self.name().to_owned(),
35            })?;
36
37        output.extend_from_slice(&decompressed);
38        Ok(())
39    }
40
41    fn name(&self) -> &'static str {
42        "zstd"
43    }
44}