use crate::error::{CacheError, Result};
pub fn check_data_size(data: &[u8], max_size: usize, data_type: &str) -> Result<()> {
if data.len() > max_size {
return Err(CacheError::Serialization(format!(
"{} data too large: {} bytes (max: {} bytes)",
data_type,
data.len(),
max_size
)));
}
Ok(())
}
#[cfg(feature = "flate2")]
pub fn compress_data(data: &[u8]) -> Result<Vec<u8>> {
use flate2::write::GzEncoder;
use flate2::Compression;
use std::io::Write;
let mut encoder = GzEncoder::new(Vec::new(), Compression::fast());
encoder
.write_all(data)
.map_err(|e| CacheError::Serialization(e.to_string()))?;
encoder
.finish()
.map_err(|e| CacheError::Serialization(e.to_string()))
}
#[cfg(feature = "flate2")]
pub fn decompress_data(data: &[u8]) -> Result<Vec<u8>> {
use flate2::read::GzDecoder;
use std::io::Read;
let mut decoder = GzDecoder::new(data);
let mut decoded = Vec::new();
decoder
.read_to_end(&mut decoded)
.map_err(|e| CacheError::Serialization(e.to_string()))?;
Ok(decoded)
}
#[cfg(not(feature = "flate2"))]
pub fn compress_data(data: &[u8]) -> Result<Vec<u8>> {
Ok(data.to_vec())
}
#[cfg(not(feature = "flate2"))]
pub fn decompress_data(data: &[u8]) -> Result<Vec<u8>> {
Ok(data.to_vec())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_check_data_size_within_limit() {
let data = vec![0u8; 1000];
assert!(check_data_size(&data, 2000, "test").is_ok());
}
#[test]
fn test_check_data_size_exceeds_limit() {
let data = vec![0u8; 3000];
assert!(check_data_size(&data, 2000, "test").is_err());
}
#[test]
#[cfg(not(feature = "flate2"))]
fn test_compress_data_no_feature() {
let data = b"hello world";
let compressed = compress_data(data).unwrap();
assert_eq!(compressed, data);
}
#[test]
#[cfg(not(feature = "flate2"))]
fn test_decompress_data_no_feature() {
let data = b"hello world";
let decompressed = decompress_data(data).unwrap();
assert_eq!(decompressed, data);
}
#[test]
#[cfg(feature = "flate2")]
fn test_compress_data_with_feature() {
let data = b"hello world";
let compressed = compress_data(data).unwrap();
assert_ne!(compressed, data);
let decompressed = decompress_data(&compressed).unwrap();
assert_eq!(decompressed, data);
}
#[test]
#[cfg(feature = "flate2")]
fn test_decompress_data_with_feature() {
let data = b"hello world";
let compressed = compress_data(data).unwrap();
let decompressed = decompress_data(&compressed).unwrap();
assert_eq!(decompressed, data);
}
}