• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::{ByteArray, Bytes};
2 use serde::Serializer;
3 
4 #[cfg(any(feature = "std", feature = "alloc"))]
5 use crate::ByteBuf;
6 
7 #[cfg(feature = "alloc")]
8 use alloc::borrow::Cow;
9 #[cfg(all(feature = "std", not(feature = "alloc")))]
10 use std::borrow::Cow;
11 
12 #[cfg(feature = "alloc")]
13 use alloc::boxed::Box;
14 
15 #[cfg(feature = "alloc")]
16 use alloc::vec::Vec;
17 
18 /// Types that can be serialized via `#[serde(with = "serde_bytes")]`.
19 pub trait Serialize {
20     #[allow(missing_docs)]
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer21     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22     where
23         S: Serializer;
24 }
25 
26 impl Serialize for [u8] {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,27     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
28     where
29         S: Serializer,
30     {
31         serializer.serialize_bytes(self)
32     }
33 }
34 
35 #[cfg(any(feature = "std", feature = "alloc"))]
36 impl Serialize for Vec<u8> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,37     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38     where
39         S: Serializer,
40     {
41         serializer.serialize_bytes(self)
42     }
43 }
44 
45 impl Serialize for Bytes {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,46     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
47     where
48         S: Serializer,
49     {
50         serializer.serialize_bytes(self)
51     }
52 }
53 
54 impl<const N: usize> Serialize for [u8; N] {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,55     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
56     where
57         S: Serializer,
58     {
59         serializer.serialize_bytes(self)
60     }
61 }
62 
63 impl<const N: usize> Serialize for ByteArray<N> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,64     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
65     where
66         S: Serializer,
67     {
68         serializer.serialize_bytes(&**self)
69     }
70 }
71 
72 #[cfg(any(feature = "std", feature = "alloc"))]
73 impl Serialize for ByteBuf {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,74     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
75     where
76         S: Serializer,
77     {
78         serializer.serialize_bytes(self)
79     }
80 }
81 
82 #[cfg(any(feature = "std", feature = "alloc"))]
83 impl<'a> Serialize for Cow<'a, [u8]> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,84     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
85     where
86         S: Serializer,
87     {
88         serializer.serialize_bytes(self)
89     }
90 }
91 
92 #[cfg(any(feature = "std", feature = "alloc"))]
93 impl<'a> Serialize for Cow<'a, Bytes> {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,94     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
95     where
96         S: Serializer,
97     {
98         serializer.serialize_bytes(self)
99     }
100 }
101 
102 impl<T> Serialize for &T
103 where
104     T: ?Sized + Serialize,
105 {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,106     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
107     where
108         S: Serializer,
109     {
110         (**self).serialize(serializer)
111     }
112 }
113 
114 #[cfg(any(feature = "std", feature = "alloc"))]
115 impl<T> Serialize for Box<T>
116 where
117     T: ?Sized + Serialize,
118 {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,119     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
120     where
121         S: Serializer,
122     {
123         (**self).serialize(serializer)
124     }
125 }
126 
127 impl<T> Serialize for Option<T>
128 where
129     T: Serialize,
130 {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,131     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
132     where
133         S: Serializer,
134     {
135         struct AsBytes<T>(T);
136 
137         impl<T> serde::Serialize for AsBytes<T>
138         where
139             T: Serialize,
140         {
141             fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
142             where
143                 S: Serializer,
144             {
145                 self.0.serialize(serializer)
146             }
147         }
148 
149         match self {
150             Some(b) => serializer.serialize_some(&AsBytes(b)),
151             None => serializer.serialize_none(),
152         }
153     }
154 }
155