bytes/
serde.rs

1use super::{Bytes, BytesMut};
2use alloc::string::String;
3use alloc::vec::Vec;
4use core::{cmp, fmt};
5use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
6
7macro_rules! serde_impl {
8    ($ty:ident, $visitor_ty:ident, $from_slice:ident, $from_vec:ident) => {
9        impl Serialize for $ty {
10            #[inline]
11            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12            where
13                S: Serializer,
14            {
15                serializer.serialize_bytes(&self)
16            }
17        }
18
19        struct $visitor_ty;
20
21        impl<'de> de::Visitor<'de> for $visitor_ty {
22            type Value = $ty;
23
24            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
25                formatter.write_str("byte array")
26            }
27
28            #[inline]
29            fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
30            where
31                V: de::SeqAccess<'de>,
32            {
33                let len = cmp::min(seq.size_hint().unwrap_or(0), 4096);
34                let mut values: Vec<u8> = Vec::with_capacity(len);
35
36                while let Some(value) = seq.next_element()? {
37                    values.push(value);
38                }
39
40                Ok($ty::$from_vec(values))
41            }
42
43            #[inline]
44            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
45            where
46                E: de::Error,
47            {
48                Ok($ty::$from_slice(v))
49            }
50
51            #[inline]
52            fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
53            where
54                E: de::Error,
55            {
56                Ok($ty::$from_vec(v))
57            }
58
59            #[inline]
60            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
61            where
62                E: de::Error,
63            {
64                Ok($ty::$from_slice(v.as_bytes()))
65            }
66
67            #[inline]
68            fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
69            where
70                E: de::Error,
71            {
72                Ok($ty::$from_vec(v.into_bytes()))
73            }
74        }
75
76        impl<'de> Deserialize<'de> for $ty {
77            #[inline]
78            fn deserialize<D>(deserializer: D) -> Result<$ty, D::Error>
79            where
80                D: Deserializer<'de>,
81            {
82                deserializer.deserialize_byte_buf($visitor_ty)
83            }
84        }
85    };
86}
87
88serde_impl!(Bytes, BytesVisitor, copy_from_slice, from);
89serde_impl!(BytesMut, BytesMutVisitor, from, from_vec);