xref: /aosp_15_r20/external/cronet/third_party/rust/chromium_crates_io/vendor/bytes-1.6.0/src/serde.rs (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 use super::{Bytes, BytesMut};
2 use alloc::string::String;
3 use alloc::vec::Vec;
4 use core::{cmp, fmt};
5 use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
6 
7 macro_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 
88 serde_impl!(Bytes, BytesVisitor, copy_from_slice, from);
89 serde_impl!(BytesMut, BytesMutVisitor, from, from_vec);
90