summaryrefslogtreecommitdiff
path: root/src/codec/encode.rs
diff options
context:
space:
mode:
authorzirkonya <zirkonya@iridium.lan>2026-08-10 02:33:11 +0200
committerzirkonya <zirkonya@iridium.lan>2026-08-10 02:33:11 +0200
commit90042cc32f95286692755451aabdc928c315e2ce (patch)
tree83996408080704fcf733c58df034a3754cba9595 /src/codec/encode.rs
parent98822553549d8772a55f5444ab3ead4b6a1e69d7 (diff)
Add context
Diffstat (limited to 'src/codec/encode.rs')
-rw-r--r--src/codec/encode.rs58
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)
+ }
+}