summaryrefslogtreecommitdiff
path: root/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec')
-rw-r--r--src/codec/decode.rs3
-rw-r--r--src/codec/encode.rs21
-rw-r--r--src/codec/error.rs2
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),