diff options
Diffstat (limited to 'src/codec/encode.rs')
| -rw-r--r-- | src/codec/encode.rs | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/src/codec/encode.rs b/src/codec/encode.rs index f23913b..a40f551 100644 --- a/src/codec/encode.rs +++ b/src/codec/encode.rs @@ -1,6 +1,55 @@ -use std::io::{self, Write}; +use crate::codec::error::Error; +use std::{io::Write, sync::Arc}; + +macro_rules! impl_encode { + ($t: ty) => { + impl Encode for $t { + fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { + let size = buffer.write(&self.to_be_bytes())?; + Ok(size) + } + } + }; +} pub trait Encode { - fn encode(&self, write: &mut dyn Write) -> io::Result<usize>; - fn encoded_size(&self) -> Option<usize>; + fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error>; +} + +impl Encode for bool { + fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { + let size = buffer.write(&[self as u8])?; + Ok(size) + } +} + +impl Encode for Arc<[u8]> { + fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { + let len = buffer.write(&self)?; + Ok(len) + } } + +impl<const S: usize> Encode for [u8; S] { + fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { + let len = buffer.write(&self)?; + Ok(len) + } +} + +impl_encode!(u8); +impl_encode!(u16); +impl_encode!(u32); +impl_encode!(u64); +impl_encode!(u128); +impl_encode!(usize); + +impl_encode!(i8); +impl_encode!(i16); +impl_encode!(i32); +impl_encode!(i64); +impl_encode!(i128); +impl_encode!(isize); + +impl_encode!(f32); +impl_encode!(f64); |
