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