diff options
Diffstat (limited to 'src/codec/encode.rs')
| -rw-r--r-- | src/codec/encode.rs | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/src/codec/encode.rs b/src/codec/encode.rs index a40f551..70d9d5c 100644 --- a/src/codec/encode.rs +++ b/src/codec/encode.rs @@ -1,10 +1,10 @@ -use crate::codec::error::Error; +use crate::{codec::error::Error, context::Context}; 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> { + fn encode(&self, buffer: &mut dyn Write, _: &dyn Context) -> Result<usize, Error> { let size = buffer.write(&self.to_be_bytes())?; Ok(size) } @@ -13,26 +13,57 @@ macro_rules! impl_encode { } pub trait Encode { - fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error>; + fn encode(&self, buffer: &mut dyn Write, ctx: &dyn Context) -> Result<usize, Error>; } impl Encode for bool { - fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { - let size = buffer.write(&[self as u8])?; + fn encode(&self, buffer: &mut dyn Write, _: &dyn Context) -> Result<usize, Error> { + let size = buffer.write(&[*self as u8])?; Ok(size) } } +impl<T: Encode> Encode for Option<T> { + fn encode(&self, buffer: &mut dyn Write, ctx: &dyn Context) -> Result<usize, Error> { + match self { + Some(val) => { + let mut size = 1u8.encode(buffer, ctx)?; + size += val.encode(buffer, ctx)?; + Ok(size) + } + None => 0u8.encode(buffer, ctx), + } + } +} + +impl<T: Encode> Encode for Vec<T> { + fn encode(&self, buffer: &mut dyn Write, ctx: &dyn Context) -> Result<usize, Error> { + let mut size = self.len().encode(buffer, ctx)?; + for item in self { + size += item.encode(buffer, ctx)?; + } + Ok(size) + } +} + +impl Encode for String { + fn encode(&self, buffer: &mut dyn Write, _: &dyn Context) -> Result<usize, Error> { + let utf8 = self.as_bytes(); + buffer.write_all(utf8)?; + Ok(utf8.len()) + } +} + impl Encode for Arc<[u8]> { - fn encode(self, buffer: &mut dyn Write) -> Result<usize, Error> { - let len = buffer.write(&self)?; + fn encode(&self, buffer: &mut dyn Write, _: &dyn Context) -> 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)?; + fn encode(&self, buffer: &mut dyn Write, _ctx: &dyn Context) -> Result<usize, Error> { + let len = buffer.write(self)?; Ok(len) } } @@ -53,3 +84,12 @@ impl_encode!(isize); impl_encode!(f32); impl_encode!(f64); + +impl<T> Encode for T +where + T: AsRef<dyn Encode>, +{ + fn encode(&self, buffer: &mut dyn Write, ctx: &dyn Context) -> Result<usize, Error> { + self.as_ref().encode(buffer, ctx) + } +} |
