diff options
Diffstat (limited to 'src/codec')
| -rw-r--r-- | src/codec/decode.rs | 3 | ||||
| -rw-r--r-- | src/codec/encode.rs | 21 | ||||
| -rw-r--r-- | src/codec/error.rs | 2 |
3 files changed, 22 insertions, 4 deletions
diff --git a/src/codec/decode.rs b/src/codec/decode.rs index 31ed725..fa4ae95 100644 --- a/src/codec/decode.rs +++ b/src/codec/decode.rs @@ -1,3 +1,4 @@ +//! Decoding: reading protocol values from a byte stream. use std::{io::Read, sync::Arc}; use crate::{DEFAULT_BUFFER_LEN, codec::error::Result}; @@ -5,6 +6,7 @@ use crate::{DEFAULT_BUFFER_LEN, codec::error::Result}; macro_rules! impl_decode { ($type: ty) => { impl<Ctx> Decode<Ctx> for $type { + // decode number using big endian fn decode(reader: &mut dyn Read, _: &mut Ctx) -> Result<Self> where Self: Sized, @@ -18,6 +20,7 @@ macro_rules! impl_decode { }; } +/// Read a value from a byte stream pub trait Decode<Ctx> { fn decode(reader: &mut dyn Read, ctx: &mut Ctx) -> Result<Self> where diff --git a/src/codec/encode.rs b/src/codec/encode.rs index bd76605..c8d1c7b 100644 --- a/src/codec/encode.rs +++ b/src/codec/encode.rs @@ -1,9 +1,11 @@ +//! Encoding: writing protocol values into a byte stream. use crate::codec::error::Error; use std::{io::Write, sync::Arc}; macro_rules! impl_encode { ($t: ty) => { impl<Ctx> Encode<Ctx> for $t { + /// write number using big endian fn encode(&self, buffer: &mut dyn Write, _: &mut Ctx) -> Result<usize, Error> { let size = buffer.write(&self.to_be_bytes())?; Ok(size) @@ -12,6 +14,7 @@ macro_rules! impl_encode { }; } +/// Write a value into a byte stream pub trait Encode<Ctx> { fn encode(&self, buffer: &mut dyn Write, ctx: &mut Ctx) -> Result<usize, Error>; } @@ -24,21 +27,24 @@ impl<Ctx> Encode<Ctx> for bool { } impl<Ctx, T: Encode<Ctx>> Encode<Ctx> for Option<T> { + /// Encode `T` if Some(T) or do nothing if None fn encode(&self, buffer: &mut dyn Write, ctx: &mut Ctx) -> Result<usize, Error> { match self { Some(val) => { - let mut size = 1u8.encode(buffer, ctx)?; - size += val.encode(buffer, ctx)?; + let size = val.encode(buffer, ctx)?; Ok(size) } - None => 0u8.encode(buffer, ctx), + None => Ok(0), } } } impl<Ctx, T: Encode<Ctx>> Encode<Ctx> for Vec<T> { + /// Encode each element of vector + /// use `CountPrefix` to prefix the vector with number of elements + /// use `LenPrefix` to prefix the vector with encoded byte size fn encode(&self, buffer: &mut dyn Write, ctx: &mut Ctx) -> Result<usize, Error> { - let mut size = self.len().encode(buffer, ctx)?; + let mut size = 0; for item in self { size += item.encode(buffer, ctx)?; } @@ -47,6 +53,9 @@ impl<Ctx, T: Encode<Ctx>> Encode<Ctx> for Vec<T> { } impl<Ctx> Encode<Ctx> for String { + /// Encode the string using utf8 + /// use `CountPrefix` to prefix the string with char length + /// use `LenPrefix` to prefix the string with utf8 bytes length fn encode(&self, buffer: &mut dyn Write, _: &mut Ctx) -> Result<usize, Error> { let utf8 = self.as_bytes(); buffer.write_all(utf8)?; @@ -55,6 +64,8 @@ impl<Ctx> Encode<Ctx> for String { } impl<Ctx> Encode<Ctx> for Arc<[u8]> { + /// write raw slice into the buffer + /// use `LenPrefix` to prefix with byte length fn encode(&self, buffer: &mut dyn Write, _: &mut Ctx) -> Result<usize, Error> { let len = buffer.write(self)?; Ok(len) @@ -62,6 +73,8 @@ impl<Ctx> Encode<Ctx> for Arc<[u8]> { } impl<Ctx, const S: usize> Encode<Ctx> for [u8; S] { + /// write raw slice into the buffer + /// use `LenPrefix` to prefix with byte length fn encode(&self, buffer: &mut dyn Write, _ctx: &mut Ctx) -> Result<usize, Error> { let len = buffer.write(self)?; Ok(len) diff --git a/src/codec/error.rs b/src/codec/error.rs index 6037a9a..c1bd4f7 100644 --- a/src/codec/error.rs +++ b/src/codec/error.rs @@ -1,5 +1,7 @@ use std::fmt::Display; +// TODO : better error (using thiserror) + #[derive(Debug)] pub enum Error { IoError(std::io::Error), |
