photon-protocol 0.0.0

Internal codec and compression traits for Photon
Documentation
use bytes::BytesMut;

use crate::ports::compress::{CompressionError, Compressor};

#[derive(Clone)]
pub struct ZstdCompressor {
    level: i32,
}

impl ZstdCompressor {
    pub fn new(level: i32) -> Self {
        Self { level }
    }
}

impl Default for ZstdCompressor {
    fn default() -> Self {
        Self { level: 3 }
    }
}

impl Compressor for ZstdCompressor {
    fn compress(&self, input: &[u8], output: &mut BytesMut) -> Result<(), CompressionError> {
        let compressed = zstd::encode_all(input, self.level)
            .map_err(|e| CompressionError::Unknown(e.into()))?;

        output.extend_from_slice(&compressed);
        Ok(())
    }

    fn decompress(&self, input: &[u8], output: &mut BytesMut) -> Result<(), CompressionError> {
        let decompressed = zstd::decode_all(input)
            .map_err(|_| CompressionError::CorruptPayload {
                compressor_name: self.name().to_owned(),
            })?;

        output.extend_from_slice(&decompressed);
        Ok(())
    }

    fn name(&self) -> &'static str {
        "zstd"
    }
}