lsm_tree/segment/meta/
compression.rsuse crate::coding::{Decode, DecodeError, Encode, EncodeError};
use byteorder::{ReadBytesExt, WriteBytesExt};
use std::io::{Read, Write};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[allow(clippy::module_name_repetitions)]
pub enum CompressionType {
None,
#[cfg(feature = "lz4")]
Lz4,
#[cfg(feature = "miniz")]
Miniz(u8),
}
impl Encode for CompressionType {
fn encode_into<W: Write>(&self, writer: &mut W) -> Result<(), EncodeError> {
match self {
Self::None => {
writer.write_u8(0)?;
writer.write_u8(0)?; }
#[cfg(feature = "lz4")]
Self::Lz4 => {
writer.write_u8(1)?;
writer.write_u8(0)?; }
#[cfg(feature = "miniz")]
Self::Miniz(level) => {
assert!(*level <= 10, "invalid miniz compression level");
writer.write_u8(2)?;
writer.write_u8(*level)?;
}
};
Ok(())
}
}
impl Decode for CompressionType {
fn decode_from<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
let tag = reader.read_u8()?;
match tag {
0 => {
assert_eq!(0, reader.read_u8()?, "Invalid compression");
Ok(Self::None)
}
#[cfg(feature = "lz4")]
1 => {
assert_eq!(0, reader.read_u8()?, "Invalid compression");
Ok(Self::Lz4)
}
#[cfg(feature = "miniz")]
2 => {
let level = reader.read_u8()?;
assert!(level <= 10, "invalid miniz compression level");
Ok(Self::Miniz(level))
}
tag => Err(DecodeError::InvalidTag(("CompressionType", tag))),
}
}
}
impl std::fmt::Display for CompressionType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::None => "no compression",
#[cfg(feature = "lz4")]
Self::Lz4 => "lz4",
#[cfg(feature = "miniz")]
Self::Miniz(_) => "miniz",
}
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test_log::test]
fn compression_serialize_none() -> crate::Result<()> {
let serialized = CompressionType::None.encode_into_vec()?;
assert_eq!(2, serialized.len());
Ok(())
}
#[cfg(feature = "lz4")]
mod lz4 {
use super::*;
#[test_log::test]
fn compression_serialize_none() -> crate::Result<()> {
let serialized = CompressionType::Lz4.encode_into_vec()?;
assert_eq!(2, serialized.len());
Ok(())
}
}
#[cfg(feature = "miniz")]
mod miniz {
use super::*;
#[test_log::test]
fn compression_serialize_none() -> crate::Result<()> {
for lvl in 0..10 {
let serialized = CompressionType::Miniz(lvl).encode_into_vec()?;
assert_eq!(2, serialized.len());
}
Ok(())
}
}
}