use crate::coding::{Decode, Encode};
use byteorder::{ReadBytesExt, WriteBytesExt};
use std::io::{Read, Write};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum CompressionType {
None,
#[cfg(feature = "lz4")]
Lz4,
}
impl std::fmt::Display for CompressionType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}",
match self {
Self::None => "none",
#[cfg(feature = "lz4")]
Self::Lz4 => "lz4",
}
)
}
}
impl Encode for CompressionType {
fn encode_into<W: Write>(&self, writer: &mut W) -> Result<(), crate::Error> {
match self {
Self::None => {
writer.write_u8(0)?;
}
#[cfg(feature = "lz4")]
Self::Lz4 => {
writer.write_u8(1)?;
}
}
Ok(())
}
}
impl Decode for CompressionType {
fn decode_from<R: Read>(reader: &mut R) -> Result<Self, crate::Error> {
let tag = reader.read_u8()?;
match tag {
0 => Ok(Self::None),
#[cfg(feature = "lz4")]
1 => Ok(Self::Lz4),
tag => Err(crate::Error::InvalidTag(("CompressionType", tag))),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use test_log::test;
#[test]
fn compression_serialize_none() {
let serialized = CompressionType::None.encode_into_vec();
assert_eq!(1, serialized.len());
}
#[cfg(feature = "lz4")]
mod lz4 {
use super::*;
use test_log::test;
#[test]
fn compression_serialize_none() {
let serialized = CompressionType::Lz4.encode_into_vec();
assert_eq!(1, serialized.len());
}
}
}