derse/impls/
cow.rs

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}