1use std::{io::Write, str};
2
3use serde::{
4 ser::{
5 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
6 SerializeTupleStruct, SerializeTupleVariant,
7 },
8 Serialize,
9};
10
11use crate::{
12 types::{
13 BLOB_ERROR_TOKEN, BLOB_STRING_TOKEN, PUSH_TOKEN, SIMPLE_ERROR_TOKEN, SIMPLE_STRING_TOKEN,
14 WITH_ATTRIBUTE_TOKEN,
15 },
16 Error,
17};
18
19pub struct Serializer<W> {
21 writer: W,
22}
23
24impl<W: Write> Serializer<W> {
25 pub fn from_write(w: W) -> Self {
27 Serializer { writer: w }
28 }
29}
30
31pub fn to_vec<S: Serialize>(s: &S) -> Result<Vec<u8>, Error> {
33 let mut result = Vec::new();
34 let mut serializer = Serializer::from_write(&mut result);
35 s.serialize(&mut serializer)?;
36
37 Ok(result)
38}
39
40impl serde::ser::Error for Error {
41 fn custom<T>(msg: T) -> Self
42 where
43 T: std::fmt::Display,
44 {
45 Error::Custom(msg.to_string())
46 }
47}
48
49enum SeqKind {
50 KnownLength,
51 UnknownLength,
52}
53
54pub struct SeqSerializer<'a, W> {
55 se: &'a mut Serializer<W>,
56 kind: SeqKind,
57 with_key: bool,
58}
59
60impl<'a, W> SeqSerializer<'a, W> {
61 fn known_length(se: &'a mut Serializer<W>) -> Self {
62 SeqSerializer {
63 se,
64 kind: SeqKind::KnownLength,
65 with_key: true,
66 }
67 }
68
69 fn unknown_length(se: &'a mut Serializer<W>) -> Self {
70 SeqSerializer {
71 se,
72 kind: SeqKind::UnknownLength,
73 with_key: true,
74 }
75 }
76
77 fn without_key(mut self) -> Self {
78 self.with_key = false;
79 self
80 }
81}
82
83impl<'a, W: Write> SerializeSeq for SeqSerializer<'a, W> {
84 type Ok = ();
85 type Error = Error;
86
87 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
88 where
89 T: serde::Serialize,
90 {
91 value.serialize(&mut *self.se)
92 }
93
94 fn end(self) -> Result<Self::Ok, Self::Error> {
95 match self.kind {
96 SeqKind::UnknownLength => self.se.write_end(),
97 SeqKind::KnownLength => Ok(()),
98 }
99 }
100}
101
102impl<'a, W: Write> SerializeTuple for SeqSerializer<'a, W> {
103 type Ok = ();
104 type Error = Error;
105
106 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
107 where
108 T: serde::Serialize,
109 {
110 value.serialize(&mut *self.se)
111 }
112
113 fn end(self) -> Result<Self::Ok, Self::Error> {
114 match self.kind {
115 SeqKind::UnknownLength => self.se.write_end(),
116 SeqKind::KnownLength => Ok(()),
117 }
118 }
119}
120
121impl<'a, W: Write> SerializeTupleStruct for SeqSerializer<'a, W> {
122 type Ok = ();
123 type Error = Error;
124
125 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
126 where
127 T: serde::Serialize,
128 {
129 value.serialize(&mut *self.se)
130 }
131
132 fn end(self) -> Result<Self::Ok, Self::Error> {
133 match self.kind {
134 SeqKind::UnknownLength => self.se.write_end(),
135 SeqKind::KnownLength => Ok(()),
136 }
137 }
138}
139
140impl<'a, W: Write> SerializeTupleVariant for SeqSerializer<'a, W> {
141 type Ok = ();
142 type Error = Error;
143
144 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
145 where
146 T: serde::Serialize,
147 {
148 value.serialize(&mut *self.se)
149 }
150
151 fn end(self) -> Result<Self::Ok, Self::Error> {
152 match self.kind {
153 SeqKind::UnknownLength => self.se.write_end(),
154 SeqKind::KnownLength => Ok(()),
155 }
156 }
157}
158
159impl<'a, W: Write> SerializeMap for SeqSerializer<'a, W> {
160 type Ok = ();
161 type Error = Error;
162
163 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
164 where
165 T: serde::Serialize,
166 {
167 key.serialize(&mut *self.se)
168 }
169
170 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
171 where
172 T: serde::Serialize,
173 {
174 value.serialize(&mut *self.se)
175 }
176
177 fn end(self) -> Result<Self::Ok, Self::Error> {
178 match self.kind {
179 SeqKind::UnknownLength => self.se.write_end(),
180 SeqKind::KnownLength => Ok(()),
181 }
182 }
183}
184
185impl<'a, W: Write> SerializeStruct for SeqSerializer<'a, W> {
186 type Ok = ();
187 type Error = Error;
188
189 fn serialize_field<T: ?Sized>(
190 &mut self,
191 key: &'static str,
192 value: &T,
193 ) -> Result<(), Self::Error>
194 where
195 T: serde::Serialize,
196 {
197 if self.with_key {
198 key.serialize(&mut *self.se)?;
199 }
200 value.serialize(&mut *self.se)
201 }
202
203 fn end(self) -> Result<Self::Ok, Self::Error> {
204 match self.kind {
205 SeqKind::UnknownLength => self.se.write_end(),
206 SeqKind::KnownLength => Ok(()),
207 }
208 }
209}
210
211impl<'a, W: Write> SerializeStructVariant for SeqSerializer<'a, W> {
212 type Ok = ();
213 type Error = Error;
214
215 fn serialize_field<T: ?Sized>(
216 &mut self,
217 key: &'static str,
218 value: &T,
219 ) -> Result<(), Self::Error>
220 where
221 T: Serialize,
222 {
223 if self.with_key {
224 key.serialize(&mut *self.se)?;
225 }
226 value.serialize(&mut *self.se)
227 }
228
229 fn end(self) -> Result<Self::Ok, Self::Error> {
230 match self.kind {
231 SeqKind::UnknownLength => self.se.write_end(),
232 SeqKind::KnownLength => Ok(()),
233 }
234 }
235}
236
237macro_rules! serialize_err {
238 ($name:ident$(<$gen_name:ident: ?Sized>)?, $($ty:ty),* => $expr:expr) => {
239 fn $name$(<$gen_name: ?Sized>)?(self, $(_: $ty),*) -> Result<Self::Ok, Self::Error> {
240 $expr
241 }
242 };
243 ($name:ident$(<$gen_name:ident: ?Sized>)?, $($ty:ty),*: $return_typ:ty => $expr:expr) => {
244 fn $name$(<$gen_name: ?Sized>)?(self, $(_: $ty),*) -> $return_typ {
245 $expr
246 }
247 };
248}
249
250struct RespSpecificSerializer<'a, W: Write> {
253 se: &'a mut Serializer<W>,
254 resp_kind: &'static str,
255}
256
257impl<'a, W: Write> serde::Serializer for RespSpecificSerializer<'a, W> {
258 type Ok = ();
259 type Error = Error;
260
261 type SerializeSeq = serde::ser::Impossible<(), Error>;
262 type SerializeTuple = serde::ser::Impossible<(), Error>;
263 type SerializeTupleStruct = serde::ser::Impossible<(), Error>;
264 type SerializeTupleVariant = serde::ser::Impossible<(), Error>;
265 type SerializeMap = serde::ser::Impossible<(), Error>;
266 type SerializeStruct = serde::ser::Impossible<(), Error>;
267 type SerializeStructVariant = serde::ser::Impossible<(), Error>;
268
269 serialize_err!(serialize_bool, bool => Err(Error::unexpected_value("bool")));
270 serialize_err!(serialize_i8, i8 => Err(Error::unexpected_value("i8")));
271 serialize_err!(serialize_i16, i16 => Err(Error::unexpected_value("i16")));
272 serialize_err!(serialize_i32, i32 => Err(Error::unexpected_value("i32")));
273 serialize_err!(serialize_i64, i64 => Err(Error::unexpected_value("i64")));
274 serialize_err!(serialize_u8, u8 => Err(Error::unexpected_value("u8")));
275 serialize_err!(serialize_u16, u16 => Err(Error::unexpected_value("u16")));
276 serialize_err!(serialize_u32, u32 => Err(Error::unexpected_value("u32")));
277 serialize_err!(serialize_u64, u64 => Err(Error::unexpected_value("u64")));
278 serialize_err!(serialize_f32, f32 => Err(Error::unexpected_value("f32")));
279 serialize_err!(serialize_f64, f64 => Err(Error::unexpected_value("f64")));
280 serialize_err!(serialize_char, char => Err(Error::unexpected_value("char")));
281 serialize_err!(serialize_none, => Err(Error::unexpected_value("none")));
282 serialize_err!(serialize_unit, => Err(Error::unexpected_value("unit")));
283 serialize_err!(serialize_some<T: ?Sized>, &T => Err(Error::unexpected_value("some")));
284 serialize_err!(serialize_unit_struct, &'static str => Err(Error::unexpected_value("unit")));
285 serialize_err!(serialize_unit_variant, &'static str, u32, &'static str =>
286 Err(Error::unexpected_value("unit_variant"))
287 );
288 serialize_err!(serialize_newtype_variant<T: ?Sized>, &'static str, u32, &'static str, &T =>
289 Err(Error::unexpected_value("newtype_variant"))
290 );
291 serialize_err!(serialize_struct_variant, &'static str, u32, &'static str, usize: Result<Self::SerializeStructVariant, Self::Error> =>
292 Err(Error::unexpected_value("struct_variant"))
293 );
294 serialize_err!(serialize_seq, Option<usize>:
295 Result<Self::SerializeSeq, Self::Error> =>
296 Err(Error::unexpected_value("seq"))
297 );
298 serialize_err!(serialize_tuple, usize:
299 Result<Self::SerializeTuple, Self::Error> =>
300 Err(Error::unexpected_value("tuple"))
301 );
302 serialize_err!(serialize_tuple_struct, &'static str, usize:
303 Result<Self::SerializeTupleStruct, Self::Error> =>
304 Err(Error::unexpected_value("tuple_struct"))
305 );
306 serialize_err!(serialize_tuple_variant,
307 &'static str, u32, &'static str, usize:
308 Result<Self::SerializeTupleStruct, Self::Error> =>
309 Err(Error::unexpected_value("tuple_variant"))
310 );
311 serialize_err!(serialize_map, Option<usize>:
312 Result<Self::SerializeMap, Self::Error> =>
313 Err(Error::unexpected_value("map"))
314 );
315 serialize_err!(serialize_struct, &'static str, usize:
316 Result<Self::SerializeMap, Self::Error> =>
317 Err(Error::unexpected_value("struct"))
318 );
319 serialize_err!(serialize_newtype_struct<T: ?Sized>, &'static str, &T =>
320 Err(Error::unexpected_value("newtype_struct"))
321 );
322
323 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
324 match self.resp_kind {
325 SIMPLE_ERROR_TOKEN => {
326 self.se.write_simple_error(v)?;
327 Ok(())
328 }
329 BLOB_ERROR_TOKEN => {
330 self.se.write_blob_error(v)?;
331 Ok(())
332 }
333 SIMPLE_STRING_TOKEN => {
334 self.se.write_simple_string(v)?;
335 Ok(())
336 }
337 BLOB_STRING_TOKEN => {
338 self.se.write_blob_string(v)?;
339 Ok(())
340 }
341 _ => unimplemented!(),
342 }
343 }
344
345 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
346 let s = str::from_utf8(v).map_err(|e| Error::utf8(e.valid_up_to()))?;
347 self.serialize_str(s)
348 }
349}
350
351struct PushSerializer<'a, W: Write> {
352 se: &'a mut Serializer<W>,
353}
354
355impl<'a, W: Write> serde::Serializer for PushSerializer<'a, W> {
356 type Ok = ();
357 type Error = Error;
358 type SerializeSeq = SeqSerializer<'a, W>;
359 type SerializeTuple = SeqSerializer<'a, W>;
360 type SerializeTupleStruct = SeqSerializer<'a, W>;
361 type SerializeTupleVariant = SeqSerializer<'a, W>;
362 type SerializeMap = SeqSerializer<'a, W>;
363 type SerializeStruct = SeqSerializer<'a, W>;
364 type SerializeStructVariant = SeqSerializer<'a, W>;
365
366 serialize_err!(serialize_bool, bool => Err(Error::unexpected_value("bool")));
367 serialize_err!(serialize_i8, i8 => Err(Error::unexpected_value("i8")));
368 serialize_err!(serialize_i16, i16 => Err(Error::unexpected_value("i16")));
369 serialize_err!(serialize_i32, i32 => Err(Error::unexpected_value("i32")));
370 serialize_err!(serialize_i64, i64 => Err(Error::unexpected_value("i64")));
371 serialize_err!(serialize_u8, u8 => Err(Error::unexpected_value("u8")));
372 serialize_err!(serialize_u16, u16 => Err(Error::unexpected_value("u16")));
373 serialize_err!(serialize_u32, u32 => Err(Error::unexpected_value("u32")));
374 serialize_err!(serialize_u64, u64 => Err(Error::unexpected_value("u64")));
375 serialize_err!(serialize_f32, f32 => Err(Error::unexpected_value("f32")));
376 serialize_err!(serialize_f64, f64 => Err(Error::unexpected_value("f64")));
377 serialize_err!(serialize_char, char => Err(Error::unexpected_value("char")));
378 serialize_err!(serialize_none, => Err(Error::unexpected_value("none")));
379 serialize_err!(serialize_unit, => Err(Error::unexpected_value("unit")));
380 serialize_err!(serialize_some<T: ?Sized>, &T => Err(Error::unexpected_value("some")));
381 serialize_err!(serialize_unit_struct, &'static str => Err(Error::unexpected_value("unit_struct")));
382 serialize_err!(serialize_unit_variant, &'static str, u32, &'static str =>
383 Err(Error::unexpected_value("unit_variant"))
384 );
385 serialize_err!(serialize_newtype_variant<T: ?Sized>, &'static str, u32, &'static str, &T =>
386 Err(Error::unexpected_value("newtype_variant"))
387 );
388 serialize_err!(serialize_str, &str => Err(Error::unexpected_value("string")));
389 serialize_err!(serialize_bytes, &[u8] => Err(Error::unexpected_value("bytes")));
390 serialize_err!(serialize_newtype_struct<T: ?Sized>, &'static str, &T =>
391 Err(Error::unexpected_value("newtype_struct"))
392 );
393 serialize_err!(serialize_map, Option<usize>: Result<Self::SerializeMap, Self::Error> => Err(Error::unexpected_value("map")));
394
395 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
396 if let Some(len) = len {
397 self.serialize_tuple(len)
398 } else {
399 Err(Error::unexpected_value("unknown len seq"))
400 }
401 }
402
403 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
404 self.se.write_push_len_marker(len)?;
405 Ok(SeqSerializer::known_length(self.se).without_key())
406 }
407
408 fn serialize_tuple_struct(
409 self,
410 _name: &'static str,
411 len: usize,
412 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
413 self.serialize_tuple(len)
414 }
415
416 fn serialize_tuple_variant(
417 self,
418 _name: &'static str,
419 _variant_index: u32,
420 _variant: &'static str,
421 len: usize,
422 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
423 self.serialize_tuple(len)
424 }
425
426 fn serialize_struct(
427 self,
428 _name: &'static str,
429 len: usize,
430 ) -> Result<Self::SerializeStruct, Self::Error> {
431 self.se.write_push_len_marker(len)?;
432 Ok(SeqSerializer::known_length(self.se).without_key())
433 }
434
435 fn serialize_struct_variant(
436 self,
437 _name: &'static str,
438 _variant_index: u32,
439 variant: &'static str,
440 len: usize,
441 ) -> Result<Self::SerializeStructVariant, Self::Error> {
442 self.serialize_struct(variant, len)
443 }
444}
445
446struct WithAttributeSerializer<'a, W: Write> {
447 se: &'a mut Serializer<W>,
448}
449
450impl<'a, W: Write> serde::Serializer for WithAttributeSerializer<'a, W> {
451 type Ok = ();
452 type Error = Error;
453 type SerializeSeq = serde::ser::Impossible<(), Error>;
454 type SerializeTuple = serde::ser::Impossible<(), Error>;
455 type SerializeTupleStruct = WithAttributeSeqSerializer<'a, W>;
456 type SerializeTupleVariant = serde::ser::Impossible<(), Error>;
457 type SerializeMap = serde::ser::Impossible<(), Error>;
458 type SerializeStruct = serde::ser::Impossible<(), Error>;
459 type SerializeStructVariant = serde::ser::Impossible<(), Error>;
460
461 serialize_err!(serialize_bool, bool => Err(Error::unexpected_value("bool")));
462 serialize_err!(serialize_i8, i8 => Err(Error::unexpected_value("i8")));
463 serialize_err!(serialize_i16, i16 => Err(Error::unexpected_value("i16")));
464 serialize_err!(serialize_i32, i32 => Err(Error::unexpected_value("i32")));
465 serialize_err!(serialize_i64, i64 => Err(Error::unexpected_value("i64")));
466 serialize_err!(serialize_u8, u8 => Err(Error::unexpected_value("u8")));
467 serialize_err!(serialize_u16, u16 => Err(Error::unexpected_value("u16")));
468 serialize_err!(serialize_u32, u32 => Err(Error::unexpected_value("u32")));
469 serialize_err!(serialize_u64, u64 => Err(Error::unexpected_value("u64")));
470 serialize_err!(serialize_f32, f32 => Err(Error::unexpected_value("f32")));
471 serialize_err!(serialize_f64, f64 => Err(Error::unexpected_value("f64")));
472 serialize_err!(serialize_char, char => Err(Error::unexpected_value("char")));
473 serialize_err!(serialize_none, => Err(Error::unexpected_value("none")));
474 serialize_err!(serialize_unit, => Err(Error::unexpected_value("unit")));
475 serialize_err!(serialize_some<T: ?Sized>, &T => Err(Error::unexpected_value("some")));
476 serialize_err!(serialize_unit_struct, &'static str => Err(Error::unexpected_value("unit_struct")));
477 serialize_err!(serialize_unit_variant, &'static str, u32, &'static str =>
478 Err(Error::unexpected_value("unit_variant"))
479 );
480 serialize_err!(serialize_newtype_variant<T: ?Sized>, &'static str, u32, &'static str, &T =>
481 Err(Error::unexpected_value("newtype_variant"))
482 );
483 serialize_err!(serialize_str, &str => Err(Error::unexpected_value("string")));
484 serialize_err!(serialize_bytes, &[u8] => Err(Error::unexpected_value("bytes")));
485 serialize_err!(serialize_newtype_struct<T: ?Sized>, &'static str, &T =>
486 Err(Error::unexpected_value("newtype_struct"))
487 );
488 serialize_err!(serialize_seq, Option<usize>: Result<Self::SerializeSeq, Self::Error> => Err(Error::unexpected_value("seq")));
489 serialize_err!(serialize_tuple, usize: Result<Self::SerializeTuple, Self::Error> =>
490 Err(Error::unexpected_value("tuple"))
491 );
492 serialize_err!(serialize_tuple_variant, &'static str, u32, &'static str, usize:
493 Result<Self::SerializeTupleVariant, Self::Error> =>
494 Err(Error::unexpected_value("tuple_variant"))
495 );
496 serialize_err!(serialize_map, Option<usize>: Result<Self::SerializeMap, Self::Error> =>
497 Err(Error::unexpected_value("map"))
498 );
499 serialize_err!(serialize_struct, &'static str, usize: Result<Self::SerializeStruct, Self::Error> =>
500 Err(Error::unexpected_value("struct"))
501 );
502 serialize_err!(serialize_struct_variant, &'static str, u32, &'static str, usize:
503 Result<Self::SerializeStruct, Self::Error> =>
504 Err(Error::unexpected_value("struct_variant"))
505 );
506
507 fn serialize_tuple_struct(
508 self,
509 name: &'static str,
510 _len: usize,
511 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
512 match name {
513 WITH_ATTRIBUTE_TOKEN => Ok(WithAttributeSeqSerializer::new(self.se)),
514 _ => Err(Error::unexpected_value("non_with_attribute_tuple_struct")),
515 }
516 }
517}
518
519enum WithAttributeState {
520 Attribute,
521 Value,
522 Done,
523}
524
525struct WithAttributeSeqSerializer<'a, W: Write> {
526 se: &'a mut Serializer<W>,
527 state: WithAttributeState,
528}
529
530impl<'a, W: Write> WithAttributeSeqSerializer<'a, W> {
531 fn new(se: &'a mut Serializer<W>) -> Self {
532 WithAttributeSeqSerializer {
533 se,
534 state: WithAttributeState::Attribute,
535 }
536 }
537}
538
539impl<'a, W: Write> SerializeTupleStruct for WithAttributeSeqSerializer<'a, W> {
540 type Ok = ();
541 type Error = Error;
542
543 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
544 where
545 T: Serialize,
546 {
547 match self.state {
548 WithAttributeState::Attribute => {
549 self.state = WithAttributeState::Value;
550 let serializer = AttributeSerializer { se: self.se };
551 value.serialize(serializer)
552 }
553 WithAttributeState::Value => {
554 self.state = WithAttributeState::Done;
555 value.serialize(&mut *self.se)
556 }
557 WithAttributeState::Done => Err(serde::ser::Error::custom(
558 "with_attribute only allow 2 fields",
559 )),
560 }
561 }
562
563 fn end(self) -> Result<Self::Ok, Self::Error> {
564 Ok(())
565 }
566}
567
568struct AttributeSerializer<'a, W: Write> {
569 se: &'a mut Serializer<W>,
570}
571
572impl<'a, W: Write> serde::Serializer for AttributeSerializer<'a, W> {
573 type Ok = ();
574 type Error = Error;
575 type SerializeSeq = serde::ser::Impossible<(), Error>;
576 type SerializeTuple = serde::ser::Impossible<(), Error>;
577 type SerializeTupleStruct = WithAttributeSeqSerializer<'a, W>;
578 type SerializeTupleVariant = serde::ser::Impossible<(), Error>;
579 type SerializeMap = SeqSerializer<'a, W>;
580 type SerializeStruct = SeqSerializer<'a, W>;
581 type SerializeStructVariant = SeqSerializer<'a, W>;
582
583 serialize_err!(serialize_bool, bool => Err(Error::unexpected_value("bool")));
584 serialize_err!(serialize_i8, i8 => Err(Error::unexpected_value("i8")));
585 serialize_err!(serialize_i16, i16 => Err(Error::unexpected_value("i16")));
586 serialize_err!(serialize_i32, i32 => Err(Error::unexpected_value("i32")));
587 serialize_err!(serialize_i64, i64 => Err(Error::unexpected_value("i64")));
588 serialize_err!(serialize_u8, u8 => Err(Error::unexpected_value("u8")));
589 serialize_err!(serialize_u16, u16 => Err(Error::unexpected_value("u16")));
590 serialize_err!(serialize_u32, u32 => Err(Error::unexpected_value("u32")));
591 serialize_err!(serialize_u64, u64 => Err(Error::unexpected_value("u64")));
592 serialize_err!(serialize_f32, f32 => Err(Error::unexpected_value("f32")));
593 serialize_err!(serialize_f64, f64 => Err(Error::unexpected_value("f64")));
594 serialize_err!(serialize_char, char => Err(Error::unexpected_value("char")));
595 serialize_err!(serialize_none, => Err(Error::unexpected_value("none")));
596 serialize_err!(serialize_unit, => Err(Error::unexpected_value("unit")));
597 serialize_err!(serialize_some<T: ?Sized>, &T => Err(Error::unexpected_value("some")));
598 serialize_err!(serialize_unit_struct, &'static str => Err(Error::unexpected_value("unit_struct")));
599 serialize_err!(serialize_unit_variant, &'static str, u32, &'static str =>
600 Err(Error::unexpected_value("unit_variant"))
601 );
602 serialize_err!(serialize_newtype_variant<T: ?Sized>, &'static str, u32, &'static str, &T =>
603 Err(Error::unexpected_value("newtype_variant"))
604 );
605 serialize_err!(serialize_str, &str => Err(Error::unexpected_value("string")));
606 serialize_err!(serialize_bytes, &[u8] => Err(Error::unexpected_value("bytes")));
607 serialize_err!(serialize_newtype_struct<T: ?Sized>, &'static str, &T =>
608 Err(Error::unexpected_value("newtype_struct"))
609 );
610 serialize_err!(serialize_seq, Option<usize>: Result<Self::SerializeSeq, Self::Error> => Err(Error::unexpected_value("seq")));
611 serialize_err!(serialize_tuple, usize: Result<Self::SerializeTuple, Self::Error> =>
612 Err(Error::unexpected_value("tuple"))
613 );
614 serialize_err!(serialize_tuple_struct, &'static str, usize:
615 Result<Self::SerializeTupleStruct, Self::Error> =>
616 Err(Error::unexpected_value("tuple_struct"))
617 );
618 serialize_err!(serialize_tuple_variant, &'static str, u32, &'static str, usize:
619 Result<Self::SerializeTupleVariant, Self::Error> =>
620 Err(Error::unexpected_value("tuple_variant"))
621 );
622
623 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
624 if let Some(l) = len {
625 self.se.write_attr_len_marker(l)?;
626 Ok(SeqSerializer::known_length(self.se))
627 } else {
628 Err(Error::unexpected_value("unknown size map"))
629 }
630 }
631
632 fn serialize_struct(
633 self,
634 _name: &'static str,
635 len: usize,
636 ) -> Result<Self::SerializeStruct, Self::Error> {
637 self.se.write_attr_len_marker(len)?;
638 Ok(SeqSerializer::known_length(self.se))
639 }
640
641 fn serialize_struct_variant(
642 self,
643 _name: &'static str,
644 _variant_index: u32,
645 variant: &'static str,
646 len: usize,
647 ) -> Result<Self::SerializeStructVariant, Self::Error> {
648 self.serialize_struct(variant, len)
649 }
650}
651
652impl<W: Write> Serializer<W> {
653 fn write_i64(&mut self, v: i64) -> Result<(), Error> {
654 write!(self.writer, ":{}\r\n", v).map_err(Error::io)?;
655
656 Ok(())
657 }
658 fn write_u64(&mut self, v: u64) -> Result<(), Error> {
659 write!(self.writer, ":{}\r\n", v).map_err(Error::io)?;
660
661 Ok(())
662 }
663 fn write_f64(&mut self, v: f64) -> Result<(), Error> {
664 if v.is_nan() {
665 return Err(Error::nan());
666 }
667
668 if v.is_infinite() {
669 if v.is_sign_positive() {
670 write!(self.writer, ",inf\r\n").map_err(Error::io)?;
671 } else {
672 write!(self.writer, ",-inf\r\n").map_err(Error::io)?;
673 }
674
675 return Ok(());
676 }
677
678 write!(self.writer, ",{:.}\r\n", v).map_err(Error::io)?;
679
680 Ok(())
681 }
682 fn write_bool(&mut self, v: bool) -> Result<(), Error> {
683 if v {
684 write!(self.writer, "#t\r\n").map_err(Error::io)?;
685 } else {
686 write!(self.writer, "#f\r\n").map_err(Error::io)?;
687 }
688
689 Ok(())
690 }
691 fn write_simple_string_char(&mut self, c: char) -> Result<(), Error> {
692 write!(self.writer, "+{}\r\n", c).map_err(Error::io)?;
693
694 Ok(())
695 }
696 fn write_simple_string(&mut self, s: &str) -> Result<(), Error> {
697 write!(self.writer, "+{}\r\n", s).map_err(Error::io)?;
698
699 Ok(())
700 }
701 fn write_blob_string(&mut self, s: &str) -> Result<(), Error> {
702 write!(self.writer, "${}\r\n{}\r\n", s.len(), s).map_err(Error::io)?;
703
704 Ok(())
705 }
706 fn write_simple_error(&mut self, s: &str) -> Result<(), Error> {
707 write!(self.writer, "-{}\r\n", s).map_err(Error::io)?;
708
709 Ok(())
710 }
711 fn write_blob_error(&mut self, s: &str) -> Result<(), Error> {
712 write!(self.writer, "!{}\r\n{}\r\n", s.len(), s).map_err(Error::io)?;
713
714 Ok(())
715 }
716 fn write_null(&mut self) -> Result<(), Error> {
717 write!(self.writer, "_\r\n").map_err(Error::io)?;
718
719 Ok(())
720 }
721 fn write_attr_len_marker(&mut self, len: usize) -> Result<(), Error> {
722 write!(self.writer, "|{}\r\n", len).map_err(Error::io)?;
723
724 Ok(())
725 }
726 fn write_push_len_marker(&mut self, len: usize) -> Result<(), Error> {
727 write!(self.writer, ">{}\r\n", len).map_err(Error::io)?;
728
729 Ok(())
730 }
731 fn write_array_len_marker(&mut self, len: usize) -> Result<(), Error> {
732 write!(self.writer, "*{}\r\n", len).map_err(Error::io)?;
733
734 Ok(())
735 }
736 fn write_array_nolen_marker(&mut self) -> Result<(), Error> {
737 write!(self.writer, "*?\r\n").map_err(Error::io)?;
738
739 Ok(())
740 }
741 fn write_map_len_marker(&mut self, len: usize) -> Result<(), Error> {
742 write!(self.writer, "%{}\r\n", len).map_err(Error::io)?;
743
744 Ok(())
745 }
746 fn write_map_nolen_marker(&mut self) -> Result<(), Error> {
747 write!(self.writer, "%?\r\n").map_err(Error::io)?;
748
749 Ok(())
750 }
751 fn write_end(&mut self) -> Result<(), Error> {
752 write!(self.writer, ".\r\n").map_err(Error::io)?;
753
754 Ok(())
755 }
756}
757
758impl<'a, W: Write> serde::Serializer for &'a mut Serializer<W> {
759 type Ok = ();
760 type Error = Error;
761 type SerializeSeq = SeqSerializer<'a, W>;
762 type SerializeTuple = SeqSerializer<'a, W>;
763 type SerializeTupleStruct = SeqSerializer<'a, W>;
764 type SerializeTupleVariant = SeqSerializer<'a, W>;
765 type SerializeMap = SeqSerializer<'a, W>;
766 type SerializeStruct = SeqSerializer<'a, W>;
767 type SerializeStructVariant = SeqSerializer<'a, W>;
768
769 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
770 self.write_bool(v)
771 }
772
773 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
774 self.serialize_i64(v as i64)
775 }
776
777 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
778 self.serialize_i64(v as i64)
779 }
780
781 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
782 self.serialize_i64(v as i64)
783 }
784
785 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
786 self.write_i64(v)
787 }
788
789 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
790 self.serialize_u64(v as u64)
791 }
792
793 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
794 self.serialize_u64(v as u64)
795 }
796
797 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
798 self.serialize_u64(v as u64)
799 }
800
801 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
802 self.write_u64(v)
803 }
804
805 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
806 self.serialize_f64(v as f64)
807 }
808
809 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
810 self.write_f64(v)
811 }
812
813 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
814 self.write_simple_string_char(v)
815 }
816
817 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
818 self.write_simple_string(v)
819 }
820
821 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
822 let s = str::from_utf8(v).map_err(|e| Error::utf8(e.valid_up_to()))?;
823 self.write_blob_string(s)
824 }
825
826 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
827 self.write_null()
828 }
829
830 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
831 where
832 T: serde::Serialize,
833 {
834 value.serialize(self)
835 }
836
837 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
838 self.write_null()
839 }
840
841 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
842 self.write_null()
843 }
844
845 fn serialize_unit_variant(
847 self,
848 _name: &'static str,
849 _variant_index: u32,
850 variant: &'static str,
851 ) -> Result<Self::Ok, Self::Error> {
852 self.write_map_len_marker(1)?;
853 self.write_simple_string(variant)?;
854 self.write_null()
855 }
856
857 fn serialize_newtype_struct<T: ?Sized>(
858 self,
859 name: &'static str,
860 value: &T,
861 ) -> Result<Self::Ok, Self::Error>
862 where
863 T: serde::Serialize,
864 {
865 match name {
866 SIMPLE_ERROR_TOKEN | BLOB_ERROR_TOKEN | SIMPLE_STRING_TOKEN | BLOB_STRING_TOKEN => {
867 let se = RespSpecificSerializer {
868 se: self,
869 resp_kind: name,
870 };
871 value.serialize(se)
872 }
873 PUSH_TOKEN => {
874 let se = PushSerializer { se: self };
875 value.serialize(se)
876 }
877 WITH_ATTRIBUTE_TOKEN => {
878 let se = WithAttributeSerializer { se: self };
879 value.serialize(se)
880 }
881 _ => value.serialize(self),
882 }
883 }
884
885 fn serialize_newtype_variant<T: ?Sized>(
887 self,
888 _name: &'static str,
889 _variant_index: u32,
890 variant: &'static str,
891 value: &T,
892 ) -> Result<Self::Ok, Self::Error>
893 where
894 T: serde::Serialize,
895 {
896 self.write_map_len_marker(1)?;
897 self.write_simple_string(variant)?;
898 value.serialize(self)
899 }
900
901 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
902 match len {
903 Some(l) => {
904 self.write_array_len_marker(l)?;
905 Ok(SeqSerializer::known_length(self))
906 }
907 None => {
908 self.write_array_nolen_marker()?;
909 Ok(SeqSerializer::unknown_length(self))
910 }
911 }
912 }
913
914 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
915 self.serialize_seq(Some(len))
916 }
917
918 fn serialize_tuple_struct(
919 self,
920 name: &'static str,
921 len: usize,
922 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
923 match name {
924 WITH_ATTRIBUTE_TOKEN => Ok(SeqSerializer::known_length(self)),
925 _ => self.serialize_seq(Some(len)),
926 }
927 }
928
929 fn serialize_tuple_variant(
931 self,
932 _name: &'static str,
933 _variant_index: u32,
934 variant: &'static str,
935 len: usize,
936 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
937 self.write_map_len_marker(1)?;
938 self.write_simple_string(variant)?;
939 self.serialize_seq(Some(len))
940 }
941
942 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
943 match len {
944 Some(l) => {
945 self.write_map_len_marker(l)?;
946 Ok(SeqSerializer::known_length(self))
947 }
948 None => {
949 self.write_map_nolen_marker()?;
950 Ok(SeqSerializer::unknown_length(self))
951 }
952 }
953 }
954
955 fn serialize_struct(
956 self,
957 _name: &'static str,
958 len: usize,
959 ) -> Result<Self::SerializeStruct, Self::Error> {
960 self.serialize_map(Some(len))
961 }
962
963 fn serialize_struct_variant(
965 self,
966 _name: &'static str,
967 _variant_index: u32,
968 variant: &'static str,
969 len: usize,
970 ) -> Result<Self::SerializeStructVariant, Self::Error> {
971 self.write_map_len_marker(1)?;
972 self.write_simple_string(variant)?;
973 self.serialize_map(Some(len))
974 }
975}
976
977#[cfg(test)]
978mod tests {
979 use std::collections::BTreeMap;
980
981 use super::*;
982
983 #[test]
984 fn test_serialize_bool() {
985 let bool_t = true;
986 let buf = to_vec(&bool_t).unwrap();
987 assert_eq!(buf, b"#t\r\n");
988
989 let bool_t = false;
990 let buf = to_vec(&bool_t).unwrap();
991 assert_eq!(buf, b"#f\r\n");
992 }
993
994 #[test]
995 fn test_serialize_number() {
996 let num: i64 = 12345;
997 let buf = to_vec(&num).unwrap();
998 assert_eq!(buf, b":12345\r\n");
999
1000 let num: i64 = -12345;
1001 let buf = to_vec(&num).unwrap();
1002 assert_eq!(buf, b":-12345\r\n");
1003 }
1004
1005 #[test]
1006 fn test_serialize_double() {
1007 let num: f64 = 12345.1;
1008 let buf = to_vec(&num).unwrap();
1009 assert_eq!(buf, b",12345.1\r\n");
1010
1011 let num: f64 = f64::NEG_INFINITY;
1012 let buf = to_vec(&num).unwrap();
1013 assert_eq!(buf, b",-inf\r\n");
1014
1015 let num: f64 = f64::INFINITY;
1016 let buf = to_vec(&num).unwrap();
1017 assert_eq!(buf, b",inf\r\n");
1018 }
1019
1020 #[test]
1021 fn test_serialize_char() {
1022 let chr: char = 'e';
1023 let buf = to_vec(&chr).unwrap();
1024 assert_eq!(buf, b"+e\r\n");
1025 }
1026
1027 #[test]
1028 fn test_serialize_str() {
1029 let str: &str = "hello world";
1030 let buf = to_vec(&str).unwrap();
1031 assert_eq!(buf, b"+hello world\r\n");
1032 }
1033
1034 #[test]
1035 fn test_serialize_option() {
1036 let str: Option<&str> = None;
1037 let buf = to_vec(&str).unwrap();
1038 assert_eq!(buf, b"_\r\n");
1039
1040 let str: Option<&str> = Some("hello world");
1041 let buf = to_vec(&str).unwrap();
1042 assert_eq!(buf, b"+hello world\r\n");
1043 }
1044
1045 #[test]
1046 fn test_serialize_unit() {
1047 let unit: () = ();
1048 let buf = to_vec(&unit).unwrap();
1049 assert_eq!(buf, b"_\r\n");
1050 }
1051
1052 #[test]
1053 fn test_serialize_struct() {
1054 #[derive(Serialize)]
1056 struct NewType(usize);
1057
1058 let newtype = NewType(123);
1059 let buf = to_vec(&newtype).unwrap();
1060 assert_eq!(buf, b":123\r\n");
1061
1062 #[derive(Serialize)]
1064 struct StructStruct {
1065 a: usize,
1066 b: String,
1067 }
1068
1069 let structstruct = StructStruct {
1070 a: 123,
1071 b: String::from("abc"),
1072 };
1073 let buf = to_vec(&structstruct).unwrap();
1074 assert_eq!(buf, b"%2\r\n+a\r\n:123\r\n+b\r\n+abc\r\n");
1075
1076 #[derive(Serialize)]
1078 struct UnitT;
1079
1080 let unit: UnitT = UnitT;
1081 let buf = to_vec(&unit).unwrap();
1082 assert_eq!(buf, b"_\r\n");
1083
1084 #[derive(Serialize)]
1086 struct Tuple(usize, String);
1087
1088 let tuple = Tuple(123, String::from("abcd"));
1089 let buf = to_vec(&tuple).unwrap();
1090 assert_eq!(buf, b"*2\r\n:123\r\n+abcd\r\n");
1091 }
1092
1093 #[test]
1094 fn test_serialize_map() {
1095 let mut map = BTreeMap::new();
1096 map.insert("a", "b");
1097 map.insert("c", "d");
1098 let buf = to_vec(&map).unwrap();
1099 assert_eq!(buf, b"%2\r\n+a\r\n+b\r\n+c\r\n+d\r\n");
1100 }
1101
1102 #[test]
1103 fn test_serialize_seq() {
1104 let seq = vec!["a", "b", "c", "d"];
1105 let buf = to_vec(&seq).unwrap();
1106 assert_eq!(buf, b"*4\r\n+a\r\n+b\r\n+c\r\n+d\r\n");
1107
1108 let seq = (1, 3, String::from("abc"), 10.5);
1109 let buf = to_vec(&seq).unwrap();
1110 assert_eq!(buf, b"*4\r\n:1\r\n:3\r\n+abc\r\n,10.5\r\n");
1111 }
1112
1113 #[test]
1114 fn test_serialize_enum() {
1115 #[derive(Serialize)]
1116 enum Enum {
1117 Struct { a: usize, b: String },
1118 Tuple(usize, String),
1119 Unit,
1120 }
1121
1122 let struct_variant = Enum::Struct {
1124 a: 123,
1125 b: String::from("abc"),
1126 };
1127 let buf = to_vec(&struct_variant).unwrap();
1128 assert_eq!(buf, b"%1\r\n+Struct\r\n%2\r\n+a\r\n:123\r\n+b\r\n+abc\r\n");
1129
1130 let tuple_variant = Enum::Tuple(123, String::from("abcd"));
1132 let buf = to_vec(&tuple_variant).unwrap();
1133 assert_eq!(buf, b"%1\r\n+Tuple\r\n*2\r\n:123\r\n+abcd\r\n");
1134
1135 let unit_variant = Enum::Unit;
1137 let buf = to_vec(&unit_variant).unwrap();
1138 assert_eq!(buf, b"%1\r\n+Unit\r\n_\r\n");
1139 }
1140}