use bincode::Decode;
use bytey_byte_buffer::{
byte_buffer::ByteBuffer,
error::{ByteBufferError, Result},
};
pub trait BincodeDecode {
fn decode<T>(&mut self) -> Result<T>
where
T: Decode;
fn decode_le<T>(&mut self) -> Result<T>
where
T: Decode;
fn decode_be<T>(&mut self) -> Result<T>
where
T: Decode;
}
impl BincodeDecode for ByteBuffer {
fn decode<T>(&mut self) -> Result<T>
where
T: Decode,
{
let size = self.read::<u64>()?;
let source = ByteBuffer::read_slice(self, size as usize)?;
let (decoded, _): (T, usize) =
bincode::decode_from_slice(source, bincode::config::standard()).map_err(|e| {
ByteBufferError::OtherError {
error: e.to_string(),
}
})?;
Ok(decoded)
}
fn decode_le<T>(&mut self) -> Result<T>
where
T: Decode,
{
let size = self.read_le::<u64>()?;
let source = ByteBuffer::read_slice(self, size as usize)?;
let (decoded, _): (T, usize) =
bincode::decode_from_slice(source, bincode::config::standard().with_little_endian())
.map_err(|e| ByteBufferError::OtherError {
error: e.to_string(),
})?;
Ok(decoded)
}
fn decode_be<T>(&mut self) -> Result<T>
where
T: Decode,
{
let size = self.read_be::<u64>()?;
let source = ByteBuffer::read_slice(self, size as usize)?;
let (decoded, _): (T, usize) =
bincode::decode_from_slice(source, bincode::config::standard().with_big_endian())
.map_err(|e| ByteBufferError::OtherError {
error: e.to_string(),
})?;
Ok(decoded)
}
}