use crate::{CompressionAlgorithm, DictionaryRegistry, HashAlgorithm, compress, encode, hash};
#[derive(Debug, Clone)]
pub struct HashEncodeResult {
pub encoded: String,
pub hash_algo: HashAlgorithm,
pub dictionary_name: String,
}
#[derive(Debug, Clone)]
pub struct CompressEncodeResult {
pub encoded: String,
pub compress_algo: CompressionAlgorithm,
pub dictionary_name: String,
}
pub fn hash_encode(
data: &[u8],
registry: &DictionaryRegistry,
) -> Result<HashEncodeResult, Box<dyn std::error::Error>> {
let algo = HashAlgorithm::random();
hash_encode_with(data, algo, registry)
}
pub fn hash_encode_with(
data: &[u8],
algo: HashAlgorithm,
registry: &DictionaryRegistry,
) -> Result<HashEncodeResult, Box<dyn std::error::Error>> {
let hashed = hash(data, algo);
let (dict_name, dict) = registry.random()?;
let encoded = encode(&hashed, &dict);
Ok(HashEncodeResult {
encoded,
hash_algo: algo,
dictionary_name: dict_name,
})
}
pub fn compress_encode(
data: &[u8],
registry: &DictionaryRegistry,
) -> Result<CompressEncodeResult, Box<dyn std::error::Error>> {
let algo = CompressionAlgorithm::random();
compress_encode_with(data, algo, registry)
}
pub fn compress_encode_with(
data: &[u8],
algo: CompressionAlgorithm,
registry: &DictionaryRegistry,
) -> Result<CompressEncodeResult, Box<dyn std::error::Error>> {
let level = algo.default_level();
let compressed = compress(data, algo, level)?;
let (dict_name, dict) = registry.random()?;
let encoded = encode(&compressed, &dict);
Ok(CompressEncodeResult {
encoded,
compress_algo: algo,
dictionary_name: dict_name,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hash_encode() {
let registry = DictionaryRegistry::load_default().unwrap();
let result = hash_encode(b"test data", ®istry).unwrap();
assert!(!result.encoded.is_empty());
assert!(!result.dictionary_name.is_empty());
}
#[test]
fn test_compress_encode() {
let registry = DictionaryRegistry::load_default().unwrap();
let result = compress_encode(b"test data for compression", ®istry).unwrap();
assert!(!result.encoded.is_empty());
assert!(!result.dictionary_name.is_empty());
}
#[test]
fn test_hash_encode_with_specific_algo() {
let registry = DictionaryRegistry::load_default().unwrap();
let result = hash_encode_with(b"test", HashAlgorithm::Sha256, ®istry).unwrap();
assert_eq!(result.hash_algo, HashAlgorithm::Sha256);
}
#[test]
fn test_compress_encode_with_specific_algo() {
let registry = DictionaryRegistry::load_default().unwrap();
let result =
compress_encode_with(b"test data", CompressionAlgorithm::Gzip, ®istry).unwrap();
assert_eq!(result.compress_algo, CompressionAlgorithm::Gzip);
}
#[test]
fn test_random_hash() {
for _ in 0..10 {
let algo = HashAlgorithm::random();
assert!(HashAlgorithm::all().contains(&algo));
}
}
#[test]
fn test_random_compress() {
for _ in 0..10 {
let algo = CompressionAlgorithm::random();
assert!(CompressionAlgorithm::all().contains(&algo));
}
}
}