From 0eefad9a196431ebb3233a81854d6cfa1680d161 Mon Sep 17 00:00:00 2001 From: Numbers Date: Wed, 18 Jun 2025 05:11:31 +0200 Subject: [PATCH] implement Option & Result --- src/impls/primitives.rs | 59 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/impls/primitives.rs b/src/impls/primitives.rs index f3d6401..9f83cab 100644 --- a/src/impls/primitives.rs +++ b/src/impls/primitives.rs @@ -45,6 +45,8 @@ impl OverTheWire for bool { fn size_hint() -> usize { 1 } } +//╶───╴Void╶─────────────────────────────────────────────────────────────────╴ + /// Implement for unit types... impl OverTheWire for () { fn serialize(&self, _: &mut T) -> e::Result<()> { Ok(()) } @@ -125,4 +127,59 @@ impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5 ); impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6 ); impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6, K7:7 ); impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6, K7:7, K8:8 ); -impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6, K7:7, K8:8, K9:9 ); \ No newline at end of file +impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6, K7:7, K8:8, K9:9 ); + + +//╶───╴Options╶──────────────────────────────────────────────────────────────╴ + +/// Implement for options +impl OverTheWire for Option { + + #[inline] + fn serialize(&self, writer: &mut T) -> e::Result<()> { + match self { + None => writer.write(&[0]), + Some(value) => { + writer.write(&[1])?; + value.serialize(writer) + } + } + } + + #[inline] + fn deserialize(reader: &mut T) -> e::Result { + if reader.bytes::<1>()?[0] == 0 { return Ok(None) } + Ok(Some(O::deserialize(reader)?)) + } + + fn size_hint() -> usize { 1 } +} + +impl OverTheWire for Result { + + #[inline] + fn serialize(&self, writer: &mut T) -> e::Result<()> { + match self { + Ok(value) => { + writer.write(&[0])?; + value.serialize(writer) + }, + Err(value) => { + writer.write(&[1])?; + value.serialize(writer) + } + } + } + + #[inline] + fn deserialize(reader: &mut T) -> e::Result { + if reader.bytes::<1>()?[0] == 0 { + return Ok(Ok(O::deserialize(reader)?)) + } + Ok(Err(E::deserialize(reader)?)) + } + + fn size_hint() -> usize { + 1 + O::size_hint().min(E::size_hint()) + } +}