support Cow<str>

This commit is contained in:
Numbers
2025-06-18 05:40:02 +02:00
parent 0eefad9a19
commit a186ceed9b
2 changed files with 37 additions and 2 deletions

View File

@@ -167,6 +167,41 @@ impl <K: OverTheWire + Ord, V: OverTheWire> OverTheWire for BTreeMap<K,V> {
Ok(buffer) 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<T: Writer>(&self, writer: &mut T) -> e::Result<()> {
(self.len() as u32).serialize(writer)?;
writer.write(self.as_bytes())?;
Ok(())
}
fn deserialize<T: Reader>(reader: &mut T) -> e::Result<Self> {
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 { fn size_hint() -> usize {
u32::size_hint() u32::size_hint()
} }

View File

@@ -173,8 +173,8 @@ impl<O: OverTheWire, E: OverTheWire> OverTheWire for Result<O, E> {
#[inline] #[inline]
fn deserialize<T: Reader>(reader: &mut T) -> e::Result<Self> { fn deserialize<T: Reader>(reader: &mut T) -> e::Result<Self> {
if reader.bytes::<1>()?[0] == 0 { if reader.bytes::<1>()?[0] == 0 {
return Ok(Ok(O::deserialize(reader)?)) return Ok(Ok(O::deserialize(reader)?))
} }
Ok(Err(E::deserialize(reader)?)) Ok(Err(E::deserialize(reader)?))
} }