implement Option & Result

This commit is contained in:
Numbers
2025-06-18 05:11:31 +02:00
parent 4dbb37cedc
commit 0eefad9a19

View File

@@ -45,6 +45,8 @@ impl OverTheWire for bool {
fn size_hint() -> usize { 1 } fn size_hint() -> usize { 1 }
} }
//╶───╴Void╶─────────────────────────────────────────────────────────────────╴
/// Implement for unit types... /// Implement for unit types...
impl OverTheWire for () { impl OverTheWire for () {
fn serialize<T: Writer>(&self, _: &mut T) -> e::Result<()> { Ok(()) } fn serialize<T: Writer>(&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 );
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 );
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 );
impl_tuple!( K0:0, K1:1, K2:2, K3:3, K4:4, K5:5, K6:6, K7:7, K8:8, K9:9 ); 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<O: OverTheWire> OverTheWire for Option<O> {
#[inline]
fn serialize<T: Writer>(&self, writer: &mut T) -> e::Result<()> {
match self {
None => writer.write(&[0]),
Some(value) => {
writer.write(&[1])?;
value.serialize(writer)
}
}
}
#[inline]
fn deserialize<T: Reader>(reader: &mut T) -> e::Result<Self> {
if reader.bytes::<1>()?[0] == 0 { return Ok(None) }
Ok(Some(O::deserialize(reader)?))
}
fn size_hint() -> usize { 1 }
}
impl<O: OverTheWire, E: OverTheWire> OverTheWire for Result<O, E> {
#[inline]
fn serialize<T: Writer>(&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<T: Reader>(reader: &mut T) -> e::Result<Self> {
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())
}
}