use crate::Blob;
use anyhow::Result;
use std::io::Cursor;
use versatiles_derive::context;
#[context("Compressing blob ({} bytes) using Zstd with highest quality settings", blob.len())]
pub fn compress_zstd(blob: &Blob) -> Result<Blob> {
let compressed = zstd::encode_all(Cursor::new(blob.as_slice()), 19)?;
Ok(Blob::from(compressed))
}
#[context("Compressing blob ({} bytes) using Zstd with fast compression settings", blob.len())]
pub fn compress_zstd_fast(blob: &Blob) -> Result<Blob> {
let compressed = zstd::encode_all(Cursor::new(blob.as_slice()), 3)?;
Ok(Blob::from(compressed))
}
#[context("Decompressing blob ({} bytes) using Zstd", blob.len())]
pub fn decompress_zstd(blob: &Blob) -> Result<Blob> {
let decompressed = zstd::decode_all(Cursor::new(blob.as_slice()))?;
Ok(Blob::from(decompressed))
}
#[cfg(test)]
mod tests {
use super::super::super::test_utils::generate_test_data;
use super::*;
#[test]
fn should_compress_and_decompress_zstd_correctly() -> Result<()> {
let data = generate_test_data(100_000);
let compressed = compress_zstd(&data)?;
let decompressed = decompress_zstd(&compressed)?;
assert_eq!(data, decompressed, "Zstd compression and decompression failed");
Ok(())
}
#[test]
fn should_compress_and_decompress_zstd_fast_correctly() -> Result<()> {
let data = generate_test_data(100_000);
let compressed = compress_zstd_fast(&data)?;
let decompressed = decompress_zstd(&compressed)?;
assert_eq!(data, decompressed, "Fast Zstd compression and decompression failed");
Ok(())
}
}