Skip to main content

kacrab_protocol/compression/
zstd.rs

1//! Zstandard codec (`zstd` crate).
2//!
3//! The module path `crate::compression::zstd` shadows the external `zstd`
4//! crate inside this file — the codec is reached via a fully-qualified
5//! `::zstd::...` path.
6
7use super::{Compression, CompressionError, CompressionErrorKind, Result};
8
9const DEFAULT_ZSTD_LEVEL: i32 = 3;
10
11/// Compress `payload` at the given level (`None` -> codec default `3`, range `1..=22`).
12pub fn compress_with_level(payload: &[u8], level: Option<i32>) -> Result<Vec<u8>> {
13    let lvl = level.unwrap_or(DEFAULT_ZSTD_LEVEL);
14    ::zstd::bulk::compress(payload, lvl).map_err(|e| encode_err(e.to_string()))
15}
16
17/// Decompress `payload`.
18pub fn decompress(payload: &[u8]) -> Result<Vec<u8>> {
19    ::zstd::stream::decode_all(payload).map_err(|e| decode_err(e.to_string()))
20}
21
22const fn encode_err(message: String) -> CompressionError {
23    CompressionError::new(
24        Compression::Zstd,
25        CompressionErrorKind::EncodeFailed { message },
26    )
27}
28
29const fn decode_err(message: String) -> CompressionError {
30    CompressionError::new(
31        Compression::Zstd,
32        CompressionErrorKind::DecodeFailed { message },
33    )
34}