From 90042cc32f95286692755451aabdc928c315e2ce Mon Sep 17 00:00:00 2001 From: zirkonya Date: Mon, 10 Aug 2026 02:33:11 +0200 Subject: Add context --- src/codec/decode.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 10 deletions(-) (limited to 'src/codec/decode.rs') diff --git a/src/codec/decode.rs b/src/codec/decode.rs index 1059811..3e03a84 100644 --- a/src/codec/decode.rs +++ b/src/codec/decode.rs @@ -1,11 +1,11 @@ use std::{io::Read, sync::Arc}; -use crate::DEFAULT_BUFFER_LEN; +use crate::{DEFAULT_BUFFER_LEN, context::Context}; macro_rules! impl_decode { ($type: ty) => { impl Decode for $type { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, _: &dyn Context) -> crate::codec::error::Result where Self: Sized, { @@ -19,13 +19,13 @@ macro_rules! impl_decode { } pub trait Decode { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, ctx: &dyn Context) -> crate::codec::error::Result where Self: Sized; } impl Decode for bool { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, _: &dyn Context) -> crate::codec::error::Result where Self: Sized, { @@ -35,8 +35,48 @@ impl Decode for bool { } } +impl Decode for Option { + fn decode(reader: &mut dyn Read, ctx: &dyn Context) -> crate::codec::error::Result + where + Self: Sized, + { + let tag = u8::decode(reader, ctx)?; + if tag == 0 { + Ok(None) + } else { + Ok(Some(T::decode(reader, ctx)?)) + } + } +} + +impl Decode for Vec { + fn decode(reader: &mut dyn Read, ctx: &dyn Context) -> crate::codec::error::Result + where + Self: Sized, + { + let len = usize::decode(reader, ctx)?; + let mut vec = Vec::with_capacity(len); + for _ in 0..len { + vec.push(T::decode(reader, ctx)?); + } + Ok(vec) + } +} + +impl Decode for String { + fn decode(reader: &mut dyn Read, _: &dyn Context) -> crate::codec::error::Result + where + Self: Sized, + { + // assume reader is limited + let mut bytes: Vec = Vec::new(); + reader.read_to_end(&mut bytes)?; + Ok(String::from_utf8_lossy(&bytes).to_string()) + } +} + impl Decode for Arc<[u8]> { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result { + fn decode(reader: &mut dyn Read, _: &dyn Context) -> crate::codec::error::Result { let mut buf = Vec::with_capacity(DEFAULT_BUFFER_LEN); reader.read_to_end(&mut buf)?; Ok(Arc::<[u8]>::from(buf.into_boxed_slice())) @@ -44,7 +84,7 @@ impl Decode for Arc<[u8]> { } impl Decode for [u8; S] { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, _: &dyn Context) -> crate::codec::error::Result where Self: Sized, { @@ -69,22 +109,22 @@ impl_decode!(i128); impl_decode!(isize); impl Decode for f64 { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, ctx: &dyn Context) -> crate::codec::error::Result where Self: Sized, { - let bits = u64::decode(reader)?; + let bits = u64::decode(reader, ctx)?; let value = f64::from_bits(bits); Ok(value) } } impl Decode for f32 { - fn decode(reader: &mut dyn Read) -> crate::codec::error::Result + fn decode(reader: &mut dyn Read, ctx: &dyn Context) -> crate::codec::error::Result where Self: Sized, { - let bits = u32::decode(reader)?; + let bits = u32::decode(reader, ctx)?; let value = f32::from_bits(bits); Ok(value) } -- cgit v1.2.3