1use crate::*;
2use std::borrow::Cow;
3
4impl Serialize for Cow<'_, [u8]> {
5 fn serialize_to<S: Serializer>(&self, serializer: &mut S) -> Result<()> {
6 <[u8]>::serialize_to(self, serializer)
7 }
8}
9
10impl<'a> Deserialize<'a> for Cow<'a, [u8]> {
11 fn deserialize_from<D: Deserializer<'a>>(buf: &mut D) -> Result<Self>
12 where
13 Self: Sized,
14 {
15 let len = VarInt64::deserialize_from(buf)?.0 as usize;
16 buf.pop(len)
17 }
18}
19
20impl Serialize for Cow<'_, str> {
21 fn serialize_to<S: Serializer>(&self, serializer: &mut S) -> Result<()> {
22 self.as_ref().serialize_to(serializer)
23 }
24}
25
26impl<'a> Deserialize<'a> for Cow<'a, str> {
27 fn deserialize_from<D: Deserializer<'a>>(buf: &mut D) -> Result<Self>
28 where
29 Self: Sized,
30 {
31 let len = VarInt64::deserialize_from(buf)?.0 as usize;
32 let front = buf.pop(len)?;
33 match front {
34 Cow::Borrowed(borrowed) => match std::str::from_utf8(borrowed) {
35 Ok(str) => Ok(Cow::Borrowed(str)),
36 Err(_) => Err(Error::InvalidString(Vec::from(borrowed))),
37 },
38 Cow::Owned(owned) => match String::from_utf8(owned) {
39 Ok(str) => Ok(Cow::Owned(str)),
40 Err(e) => Err(Error::InvalidString(e.into_bytes())),
41 },
42 }
43 }
44}
45
46impl<T: ToOwned<Owned = T> + Serialize> Serialize for Cow<'_, T> {
47 fn serialize_to<S: Serializer>(&self, serializer: &mut S) -> Result<()> {
48 self.as_ref().serialize_to(serializer)
49 }
50}
51
52impl<'a, T: ToOwned<Owned = T> + Deserialize<'a>> Deserialize<'a> for Cow<'a, T> {
53 fn deserialize_from<D: Deserializer<'a>>(buf: &mut D) -> Result<Self>
54 where
55 Self: Sized,
56 {
57 Ok(Cow::Owned(T::deserialize_from(buf)?))
58 }
59}