diff --git a/src/impls/lib_alloc.rs b/src/impls/lib_alloc.rs index a02ad42..b2393e3 100644 --- a/src/impls/lib_alloc.rs +++ b/src/impls/lib_alloc.rs @@ -167,6 +167,41 @@ impl OverTheWire for BTreeMap { Ok(buffer) } + fn size_hint() -> usize { + u32::size_hint() + } +} + +//╶───╴Copy On Write╶────────────────────────────────────────────────────────╴ + + +// Pretty much identical to String but allows for refs to be used +impl<'l> OverTheWire for alloc::borrow::Cow<'l, str> { + + fn serialize(&self, writer: &mut T) -> e::Result<()> { + (self.len() as u32).serialize(writer)?; + writer.write(self.as_bytes())?; + Ok(()) + } + + fn deserialize(reader: &mut T) -> e::Result { + let len = u32::deserialize(reader)?; + + #[cfg(feature = "extra-validation")] + if len as usize > reader.remainder_hint() { + return Err(MalformedData)?; + } + + let mut vec = Vec::with_capacity(len as usize); + unsafe { vec.set_len(len as usize) }; + reader.read(vec.as_mut_slice())?; + + let s = String::from_utf8(vec) + .map_err(|_|MalformedData)?; + + Ok(alloc::borrow::Cow::Owned(s)) + } + fn size_hint() -> usize { u32::size_hint() } diff --git a/src/impls/primitives.rs b/src/impls/primitives.rs index 9f83cab..a2179a2 100644 --- a/src/impls/primitives.rs +++ b/src/impls/primitives.rs @@ -173,8 +173,8 @@ impl OverTheWire for Result { #[inline] fn deserialize(reader: &mut T) -> e::Result { - if reader.bytes::<1>()?[0] == 0 { - return Ok(Ok(O::deserialize(reader)?)) + if reader.bytes::<1>()?[0] == 0 { + return Ok(Ok(O::deserialize(reader)?)) } Ok(Err(E::deserialize(reader)?)) }