mod codec_type;
mod error;
pub use codec_type::CompressionType;
pub use error::CompressionError;
use bytes::Bytes;
pub fn compress(ct: CompressionType, data: &[u8]) -> Result<Bytes, CompressionError> {
match ct {
CompressionType::None => Ok(Bytes::copy_from_slice(data)),
CompressionType::Gzip => gzip_compress(data),
CompressionType::Snappy => snappy_compress(data),
CompressionType::Lz4 => lz4_compress(data),
CompressionType::Zstd => zstd_compress(data),
}
}
pub fn decompress(
ct: CompressionType,
data: &[u8],
max_output: usize,
) -> Result<Bytes, CompressionError> {
match ct {
CompressionType::None => {
if data.len() > max_output {
Err(CompressionError::TooLarge { limit: max_output })
} else {
Ok(Bytes::copy_from_slice(data))
}
}
CompressionType::Gzip => gzip_decompress(data, max_output),
CompressionType::Snappy => snappy_decompress(data, max_output),
CompressionType::Lz4 => lz4_decompress(data, max_output),
CompressionType::Zstd => zstd_decompress(data, max_output),
}
}
#[cfg(feature = "gzip")]
mod gzip;
#[cfg(feature = "gzip")]
use crate::gzip::{compress as gzip_compress, decompress as gzip_decompress};
#[cfg(not(feature = "gzip"))]
fn gzip_compress(_: &[u8]) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("gzip"))
}
#[cfg(not(feature = "gzip"))]
fn gzip_decompress(_: &[u8], _: usize) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("gzip"))
}
#[cfg(feature = "snappy")]
mod snappy;
#[cfg(feature = "snappy")]
use crate::snappy::{compress as snappy_compress, decompress as snappy_decompress};
#[cfg(not(feature = "snappy"))]
fn snappy_compress(_: &[u8]) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("snappy"))
}
#[cfg(not(feature = "snappy"))]
fn snappy_decompress(_: &[u8], _: usize) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("snappy"))
}
#[cfg(feature = "lz4")]
mod lz4;
#[cfg(feature = "lz4")]
use crate::lz4::{compress as lz4_compress, decompress as lz4_decompress};
#[cfg(not(feature = "lz4"))]
fn lz4_compress(_: &[u8]) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("lz4"))
}
#[cfg(not(feature = "lz4"))]
fn lz4_decompress(_: &[u8], _: usize) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("lz4"))
}
#[cfg(feature = "zstd")]
mod zstd;
#[cfg(feature = "zstd")]
use crate::zstd::{compress as zstd_compress, decompress as zstd_decompress};
#[cfg(not(feature = "zstd"))]
fn zstd_compress(_: &[u8]) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("zstd"))
}
#[cfg(not(feature = "zstd"))]
fn zstd_decompress(_: &[u8], _: usize) -> Result<Bytes, CompressionError> {
Err(CompressionError::FeatureDisabled("zstd"))
}
#[cfg(test)]
mod tests {
use super::*;
use assert2::assert;
#[test]
fn passthrough_none_compress() {
let out = compress(CompressionType::None, b"abcdef").unwrap();
assert!(out.as_ref() == b"abcdef");
}
#[test]
fn passthrough_none_decompress() {
let out = decompress(CompressionType::None, b"abcdef", 1024).unwrap();
assert!(out.as_ref() == b"abcdef");
}
#[test]
fn passthrough_none_decompress_respects_cap() {
assert!(matches!(
decompress(CompressionType::None, b"abcdef", 3),
Err(CompressionError::TooLarge { limit: 3 })
));
}
}