use crate::CompressionType;
#[derive(Debug, Clone)]
pub struct CompressionSelector {
per_level_compression: Vec<CompressionType>,
}
impl CompressionSelector {
pub fn new(per_level: Vec<CompressionType>) -> Self {
Self {
per_level_compression: per_level,
}
}
pub fn select_compression(&self, level: u8) -> CompressionType {
if self.per_level_compression.is_empty() {
return CompressionType::None;
}
let idx = level as usize;
if idx < self.per_level_compression.len() {
self.per_level_compression[idx]
} else {
*self.per_level_compression.last().unwrap_or(&CompressionType::None)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_compression_defaults_to_none() {
let selector = CompressionSelector::new(Vec::new());
assert_eq!(selector.select_compression(0), CompressionType::None);
assert_eq!(selector.select_compression(1), CompressionType::None);
assert_eq!(selector.select_compression(5), CompressionType::None);
}
#[test]
fn test_per_level_compression() {
let selector = CompressionSelector::new(vec![
CompressionType::None,
CompressionType::SnappyCompression,
]);
assert_eq!(selector.select_compression(0), CompressionType::None);
assert_eq!(selector.select_compression(1), CompressionType::SnappyCompression);
assert_eq!(selector.select_compression(2), CompressionType::SnappyCompression);
assert_eq!(selector.select_compression(5), CompressionType::SnappyCompression);
}
#[test]
fn test_per_level_with_more_levels() {
let selector = CompressionSelector::new(vec![
CompressionType::None, CompressionType::SnappyCompression, CompressionType::SnappyCompression, ]);
assert_eq!(selector.select_compression(0), CompressionType::None);
assert_eq!(selector.select_compression(1), CompressionType::SnappyCompression);
assert_eq!(selector.select_compression(2), CompressionType::SnappyCompression);
assert_eq!(selector.select_compression(3), CompressionType::SnappyCompression);
assert_eq!(selector.select_compression(10), CompressionType::SnappyCompression);
}
}