scuffle_bytes_util/cow/bytes/
serde.rs1use super::BytesCow;
2
3impl serde::Serialize for BytesCow<'_> {
4 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
5 where
6 S: serde::Serializer,
7 {
8 serializer.serialize_bytes(self.as_bytes())
9 }
10}
11
12impl<'de> serde::Deserialize<'de> for BytesCow<'de> {
13 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14 where
15 D: serde::Deserializer<'de>,
16 {
17 struct BytesCowVisitor;
18
19 impl<'de> serde::de::Visitor<'de> for BytesCowVisitor {
20 type Value = BytesCow<'de>;
21
22 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
23 formatter.write_str("a byte slice")
24 }
25
26 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
27 where
28 E: serde::de::Error,
29 {
30 Ok(BytesCow::from_vec(v))
31 }
32
33 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
34 where
35 E: serde::de::Error,
36 {
37 Ok(BytesCow::from_vec(v.to_vec()))
38 }
39
40 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
41 where
42 E: serde::de::Error,
43 {
44 Ok(BytesCow::from_vec(v.as_bytes().to_vec()))
45 }
46
47 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
48 where
49 E: serde::de::Error,
50 {
51 Ok(BytesCow::from_vec(v.into_bytes()))
52 }
53
54 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
55 where
56 E: serde::de::Error,
57 {
58 Ok(BytesCow::from_slice(v))
59 }
60
61 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
62 where
63 E: serde::de::Error,
64 {
65 Ok(BytesCow::from_slice(v.as_bytes()))
66 }
67 }
68
69 deserializer.deserialize_bytes(BytesCowVisitor)
70 }
71}
72
73#[cfg(test)]
74#[cfg_attr(all(test, coverage_nightly), coverage(off))]
75mod tests {
76 use std::fmt::Display;
77
78 use serde::ser::Impossible;
79 use serde::{Deserialize, Serialize};
80
81 use crate::BytesCow;
82
83 #[test]
84 fn serialize() {
85 #[derive(Debug)]
86 struct TestError;
87
88 impl Display for TestError {
89 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
90 write!(f, "Test error")
91 }
92 }
93
94 impl std::error::Error for TestError {}
95
96 impl serde::ser::Error for TestError {
97 fn custom<T: std::fmt::Display>(msg: T) -> Self {
98 panic!("{}", msg)
99 }
100 }
101
102 struct TestSerializer;
103
104 impl serde::Serializer for TestSerializer {
105 type Error = TestError;
106 type Ok = ();
107 type SerializeMap = Impossible<(), Self::Error>;
108 type SerializeSeq = Impossible<(), Self::Error>;
109 type SerializeStruct = Impossible<(), Self::Error>;
110 type SerializeStructVariant = Impossible<(), Self::Error>;
111 type SerializeTuple = Impossible<(), Self::Error>;
112 type SerializeTupleStruct = Impossible<(), Self::Error>;
113 type SerializeTupleVariant = Impossible<(), Self::Error>;
114
115 fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
116 panic!("BytesCow must be serialized as bytes")
117 }
118
119 fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Self::Error> {
120 panic!("BytesCow must be serialized as bytes")
121 }
122
123 fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
124 panic!("BytesCow must be serialized as bytes")
125 }
126
127 fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
128 panic!("BytesCow must be serialized as bytes")
129 }
130
131 fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
132 panic!("BytesCow must be serialized as bytes")
133 }
134
135 fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Self::Error> {
136 panic!("BytesCow must be serialized as bytes")
137 }
138
139 fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Self::Error> {
140 panic!("BytesCow must be serialized as bytes")
141 }
142
143 fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Self::Error> {
144 panic!("BytesCow must be serialized as bytes")
145 }
146
147 fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
148 panic!("BytesCow must be serialized as bytes")
149 }
150
151 fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
152 panic!("BytesCow must be serialized as bytes")
153 }
154
155 fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
156 panic!("BytesCow must be serialized as bytes")
157 }
158
159 fn serialize_char(self, _v: char) -> Result<Self::Ok, Self::Error> {
160 panic!("BytesCow must be serialized as bytes")
161 }
162
163 fn serialize_str(self, _v: &str) -> Result<Self::Ok, Self::Error> {
164 panic!("BytesCow must be serialized as bytes")
165 }
166
167 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
168 assert_eq!(v, b"hello");
169 Ok(())
170 }
171
172 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
173 panic!("BytesCow must be serialized as bytes")
174 }
175
176 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
177 where
178 T: serde::Serialize + ?Sized,
179 {
180 panic!("BytesCow must be serialized as bytes")
181 }
182
183 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
184 panic!("BytesCow must be serialized as bytes")
185 }
186
187 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
188 panic!("BytesCow must be serialized as bytes")
189 }
190
191 fn serialize_unit_variant(
192 self,
193 _name: &'static str,
194 _variant_index: u32,
195 _variant: &'static str,
196 ) -> Result<Self::Ok, Self::Error> {
197 panic!("BytesCow must be serialized as bytes")
198 }
199
200 fn serialize_newtype_variant<T>(
201 self,
202 _name: &'static str,
203 _variant_index: u32,
204 _variant: &'static str,
205 _value: &T,
206 ) -> Result<Self::Ok, Self::Error>
207 where
208 T: serde::Serialize + ?Sized,
209 {
210 panic!("BytesCow must be serialized as bytes")
211 }
212
213 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
214 panic!("BytesCow must be serialized as bytes")
215 }
216
217 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
218 panic!("BytesCow must be serialized as bytes")
219 }
220
221 fn serialize_tuple_struct(
222 self,
223 _name: &'static str,
224 _len: usize,
225 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
226 panic!("BytesCow must be serialized as bytes")
227 }
228
229 fn serialize_tuple_variant(
230 self,
231 _name: &'static str,
232 _variant_index: u32,
233 _variant: &'static str,
234 _len: usize,
235 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
236 panic!("BytesCow must be serialized as bytes")
237 }
238
239 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
240 panic!("BytesCow must be serialized as bytes")
241 }
242
243 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct, Self::Error> {
244 panic!("BytesCow must be serialized as bytes")
245 }
246
247 fn serialize_struct_variant(
248 self,
249 _name: &'static str,
250 _variant_index: u32,
251 _variant: &'static str,
252 _len: usize,
253 ) -> Result<Self::SerializeStructVariant, Self::Error> {
254 panic!("BytesCow must be serialized as bytes")
255 }
256
257 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<Self::Ok, Self::Error>
258 where
259 T: ?Sized + serde::Serialize,
260 {
261 panic!("BytesCow must be serialized as bytes")
262 }
263 }
264
265 let cow = BytesCow::from_slice(b"hello");
266 let serializer = TestSerializer;
267 cow.serialize(serializer).expect("serialization failed");
268 }
269
270 #[test]
271 fn deserialize() {
272 #[derive(Debug)]
273 struct TestError;
274
275 impl Display for TestError {
276 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
277 write!(f, "Test error")
278 }
279 }
280
281 impl std::error::Error for TestError {}
282
283 impl serde::de::Error for TestError {
284 fn custom<T: std::fmt::Display>(msg: T) -> Self {
285 assert_eq!(msg.to_string(), "invalid type: Option value, expected a byte slice");
286 Self
287 }
288 }
289
290 enum Mode {
291 ByteBuf,
292 Bytes,
293 Str,
294 String,
295 BorrowedBytes,
296 BorrowedStr,
297 None,
298 }
299
300 struct TestDeserializer {
301 mode: Mode,
302 }
303
304 impl<'de> serde::Deserializer<'de> for TestDeserializer {
305 type Error = TestError;
306
307 serde::forward_to_deserialize_any! {
308 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes byte_buf
309 option unit unit_struct newtype_struct seq tuple tuple_struct
310 map struct enum identifier ignored_any
311 }
312
313 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
314 where
315 V: serde::de::Visitor<'de>,
316 {
317 match self.mode {
318 Mode::ByteBuf => visitor.visit_byte_buf(vec![b'h', b'e', b'l', b'l', b'o']),
319 Mode::Bytes => visitor.visit_bytes(b"hello"),
320 Mode::Str => visitor.visit_str("hello"),
321 Mode::String => visitor.visit_string("hello".to_owned()),
322 Mode::BorrowedBytes => visitor.visit_borrowed_bytes(b"hello"),
323 Mode::BorrowedStr => visitor.visit_borrowed_str("hello"),
324 Mode::None => visitor.visit_none(),
325 }
326 }
327 }
328
329 fn test_de(de: TestDeserializer) {
330 let cow = BytesCow::deserialize(de).expect("deserialization failed");
331 assert_eq!(cow.as_bytes(), b"hello");
332 }
333
334 test_de(TestDeserializer { mode: Mode::ByteBuf });
335 test_de(TestDeserializer { mode: Mode::Bytes });
336 test_de(TestDeserializer { mode: Mode::Str });
337 test_de(TestDeserializer { mode: Mode::String });
338 test_de(TestDeserializer {
339 mode: Mode::BorrowedBytes,
340 });
341 test_de(TestDeserializer { mode: Mode::BorrowedStr });
342
343 BytesCow::deserialize(TestDeserializer { mode: Mode::None }).expect_err("deserialization should fail");
344 }
345}