use bincode::{Decode, Encode};
use snap::raw::{Decoder, Encoder};
#[derive(Debug)]
pub(crate) struct Dec {
encoder: Option<snap::raw::Encoder>,
decoder: Option<snap::raw::Decoder>,
}
impl Dec {
pub fn new(compress: bool) -> Dec {
let (encoder, decoder) = if compress {
(Some(Encoder::new()), Some(Decoder::new()))
} else {
(None, None)
};
Self { encoder, decoder }
}
pub fn deser<T: Decode>(
&mut self,
bytes: &[u8],
) -> crate::error::GhalaDbResult<T> {
let t: T = if let Some(ref mut dcr) = self.decoder {
Self::deser_raw(&dcr.decompress_vec(bytes)?)?
} else {
Self::deser_raw(bytes)?
};
Ok(t)
}
pub fn deser_raw<T: Decode>(bytes: &[u8]) -> crate::error::GhalaDbResult<T> {
Ok(bincode::decode_from_slice(bytes, Self::conf())?.0)
}
pub fn ser<T: ?Sized + Encode>(
&mut self,
value: &T,
) -> crate::error::GhalaDbResult<Vec<u8>> {
let bytes = Self::ser_raw(value)?;
let ret = if let Some(ref mut enc) = self.encoder {
enc.compress_vec(&bytes)?
} else {
bytes
};
Ok(ret)
}
pub fn ser_raw<T: ?Sized + Encode>(
value: &T,
) -> crate::error::GhalaDbResult<Vec<u8>> {
Ok(bincode::encode_to_vec(value, Self::conf())?)
}
#[inline]
fn conf() -> impl bincode::config::Config {
bincode::config::standard()
.with_little_endian()
.with_fixed_int_encoding()
.with_no_limit()
}
}