diff options
Diffstat (limited to 'src/codec/decode.rs')
| -rw-r--r-- | src/codec/decode.rs | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/src/codec/decode.rs b/src/codec/decode.rs index 65f08b5..1059811 100644 --- a/src/codec/decode.rs +++ b/src/codec/decode.rs @@ -1,7 +1,91 @@ -use std::io::{self, Read}; +use std::{io::Read, sync::Arc}; + +use crate::DEFAULT_BUFFER_LEN; + +macro_rules! impl_decode { + ($type: ty) => { + impl Decode for $type { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> + where + Self: Sized, + { + const BYTES: usize = (<$type>::BITS / 8) as usize; + let mut bytes = [0; BYTES]; + reader.read_exact(&mut bytes)?; + Ok(<$type>::from_be_bytes(bytes)) + } + } + }; +} pub trait Decode { - fn decode(reader: &impl Read) -> io::Result<Self> + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> where Self: Sized; } + +impl Decode for bool { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> + where + Self: Sized, + { + let mut byte = [0_u8]; + reader.read_exact(&mut byte)?; + Ok(byte[0] != 0) + } +} + +impl Decode for Arc<[u8]> { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> { + let mut buf = Vec::with_capacity(DEFAULT_BUFFER_LEN); + reader.read_to_end(&mut buf)?; + Ok(Arc::<[u8]>::from(buf.into_boxed_slice())) + } +} + +impl<const S: usize> Decode for [u8; S] { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> + where + Self: Sized, + { + let mut slice = [0_u8; S]; + reader.read_exact(&mut slice)?; + Ok(slice) + } +} + +impl_decode!(u8); +impl_decode!(u16); +impl_decode!(u32); +impl_decode!(u64); +impl_decode!(u128); +impl_decode!(usize); + +impl_decode!(i8); +impl_decode!(i16); +impl_decode!(i32); +impl_decode!(i64); +impl_decode!(i128); +impl_decode!(isize); + +impl Decode for f64 { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> + where + Self: Sized, + { + let bits = u64::decode(reader)?; + let value = f64::from_bits(bits); + Ok(value) + } +} + +impl Decode for f32 { + fn decode(reader: &mut dyn Read) -> crate::codec::error::Result<Self> + where + Self: Sized, + { + let bits = u32::decode(reader)?; + let value = f32::from_bits(bits); + Ok(value) + } +} |
