1use std::io;
2
3use serde::ser;
4use watson_rs::serializer;
5use watson_rs::serializer::WriteInsn;
6use watson_rs::unlexer;
7use watson_rs::{Insn, Value};
8
9use crate::error::{Error, Result};
10
11pub struct Serializer<W> {
13 inner: serializer::Serializer<W>,
14}
15
16impl<W> Serializer<W> {
17 pub fn new(writer: W) -> Self {
19 Serializer {
20 inner: serializer::Serializer::new(writer),
21 }
22 }
23
24 pub fn into_inner(self) -> W {
26 self.inner.into_inner()
27 }
28}
29
30impl<W> Serializer<unlexer::Unlexer<W>>
31where
32 W: io::Write,
33{
34 pub fn from_writer(writer: W) -> Self {
36 Serializer {
37 inner: serializer::Serializer::new(unlexer::Unlexer::new(writer)),
38 }
39 }
40}
41
42impl<'a, W> ser::Serializer for &'a mut Serializer<W>
43where
44 W: WriteInsn,
45{
46 type Ok = ();
47 type Error = Error;
48 type SerializeSeq = SerializeSeq<'a, W>;
49 type SerializeTuple = SerializeTuple<'a, W>;
50 type SerializeTupleStruct = SerializeTupleStruct<'a, W>;
51 type SerializeTupleVariant = SerializeTupleVariant<'a, W>;
52 type SerializeMap = SerializeMap<'a, W>;
53 type SerializeStruct = SerializeStruct<'a, W>;
54 type SerializeStructVariant = SerializeStructVariant<'a, W>;
55
56 fn serialize_bool(self, v: bool) -> Result<()> {
57 self.inner.serialize(&Value::Bool(v))?;
58 Ok(())
59 }
60
61 fn serialize_i8(self, v: i8) -> Result<()> {
62 self.inner.serialize(&Value::Int(v as i64))?;
63 Ok(())
64 }
65
66 fn serialize_i16(self, v: i16) -> Result<()> {
67 self.inner.serialize(&Value::Int(v as i64))?;
68 Ok(())
69 }
70
71 fn serialize_i32(self, v: i32) -> Result<()> {
72 self.inner.serialize(&Value::Int(v as i64))?;
73 Ok(())
74 }
75
76 fn serialize_i64(self, v: i64) -> Result<()> {
77 self.inner.serialize(&Value::Int(v as i64))?;
78 Ok(())
79 }
80
81 fn serialize_u8(self, v: u8) -> Result<()> {
82 self.inner.serialize(&Value::Uint(v as u64))?;
83 Ok(())
84 }
85
86 fn serialize_u16(self, v: u16) -> Result<()> {
87 self.inner.serialize(&Value::Uint(v as u64))?;
88 Ok(())
89 }
90
91 fn serialize_u32(self, v: u32) -> Result<()> {
92 self.inner.serialize(&Value::Uint(v as u64))?;
93 Ok(())
94 }
95
96 fn serialize_u64(self, v: u64) -> Result<()> {
97 self.inner.serialize(&Value::Uint(v as u64))?;
98 Ok(())
99 }
100
101 fn serialize_f32(self, v: f32) -> Result<()> {
102 self.inner.serialize(&Value::Float(v as f64))?;
103 Ok(())
104 }
105
106 fn serialize_f64(self, v: f64) -> Result<()> {
107 self.inner.serialize(&Value::Float(v as f64))?;
108 Ok(())
109 }
110
111 fn serialize_char(self, v: char) -> Result<()> {
112 let mut buf = [0; 4];
113 self.serialize_str(v.encode_utf8(&mut buf))
114 }
115
116 fn serialize_str(self, v: &str) -> Result<()> {
117 self.serialize_bytes(v.as_bytes())
118 }
119
120 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
121 self.inner.serialize(&Value::String(v.to_vec()))?;
122 Ok(())
123 }
124
125 fn serialize_none(self) -> Result<()> {
126 self.inner.serialize(&Value::Nil)?;
127 Ok(())
128 }
129
130 fn serialize_some<T>(self, value: &T) -> Result<()>
131 where
132 T: ?Sized + ser::Serialize,
133 {
134 value.serialize(self)
135 }
136
137 fn serialize_unit(self) -> Result<()> {
138 self.inner.serialize(&Value::Nil)?;
139 Ok(())
140 }
141
142 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
143 self.inner.serialize(&Value::Nil)?;
144 Ok(())
145 }
146
147 fn serialize_unit_variant(
148 self,
149 _name: &'static str,
150 _variant_index: u32,
151 variant: &'static str,
152 ) -> Result<()> {
153 self.serialize_str(variant)
154 }
155
156 fn serialize_newtype_struct<T>(self, name: &'static str, value: &T) -> Result<()>
157 where
158 T: ?Sized + ser::Serialize,
159 {
160 self.inner.write(Insn::Onew)?;
161 self.serialize_str(name)?;
162 value.serialize(&mut *self)?;
163 self.inner.write(Insn::Oadd)?;
164 Ok(())
165 }
166
167 fn serialize_newtype_variant<T>(
168 self,
169 _name: &'static str,
170 _variant_index: u32,
171 variant: &'static str,
172 value: &T,
173 ) -> Result<()>
174 where
175 T: ?Sized + ser::Serialize,
176 {
177 self.inner.write(Insn::Onew)?;
178 self.serialize_str(variant)?;
179 value.serialize(&mut *self)?;
180 self.inner.write(Insn::Oadd)?;
181 Ok(())
182 }
183
184 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
185 self.inner.write(Insn::Anew)?;
186 Ok(SerializeSeq { ser: self })
187 }
188
189 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
190 self.serialize_seq(None)
191 }
192
193 fn serialize_tuple_struct(
194 self,
195 _name: &'static str,
196 _len: usize,
197 ) -> Result<Self::SerializeTupleStruct> {
198 self.serialize_seq(None)
199 }
200
201 fn serialize_tuple_variant(
202 self,
203 _name: &'static str,
204 _variant_index: u32,
205 variant: &'static str,
206 _len: usize,
207 ) -> Result<Self::SerializeTupleVariant> {
208 self.inner.write(Insn::Onew)?;
209 self.serialize_str(variant)?;
210 self.serialize_seq(None)
211 }
212
213 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
214 self.inner.write(Insn::Onew)?;
215 Ok(SerializeMap { ser: self })
216 }
217
218 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
219 self.serialize_map(None)
220 }
221
222 fn serialize_struct_variant(
223 self,
224 _name: &'static str,
225 _variant_index: u32,
226 variant: &'static str,
227 _len: usize,
228 ) -> Result<Self::SerializeStructVariant> {
229 self.inner.write(Insn::Onew)?;
230 self.serialize_str(variant)?;
231 self.serialize_map(None)
232 }
233}
234
235pub struct SerializeSeq<'a, W> {
236 ser: &'a mut Serializer<W>,
237}
238
239impl<'a, W> ser::SerializeSeq for SerializeSeq<'a, W>
240where
241 W: WriteInsn,
242{
243 type Ok = ();
244 type Error = Error;
245
246 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
247 where
248 T: ?Sized + ser::Serialize,
249 {
250 value.serialize(&mut *self.ser)?;
251 self.ser.inner.write(Insn::Aadd)?;
252 Ok(())
253 }
254
255 fn end(self) -> Result<()> {
256 Ok(())
257 }
258}
259
260type SerializeTuple<'a, W> = SerializeSeq<'a, W>;
261
262impl<'a, W> ser::SerializeTuple for SerializeTuple<'a, W>
263where
264 W: WriteInsn,
265{
266 type Ok = ();
267 type Error = Error;
268
269 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
270 where
271 T: ?Sized + ser::Serialize,
272 {
273 ser::SerializeSeq::serialize_element(self, value)
274 }
275
276 fn end(self) -> Result<()> {
277 ser::SerializeSeq::end(self)
278 }
279}
280
281type SerializeTupleStruct<'a, W> = SerializeSeq<'a, W>;
282
283impl<'a, W> ser::SerializeTupleStruct for SerializeTupleStruct<'a, W>
284where
285 W: WriteInsn,
286{
287 type Ok = ();
288 type Error = Error;
289
290 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
291 where
292 T: ?Sized + ser::Serialize,
293 {
294 ser::SerializeSeq::serialize_element(self, value)
295 }
296
297 fn end(self) -> Result<()> {
298 ser::SerializeSeq::end(self)
299 }
300}
301
302type SerializeTupleVariant<'a, W> = SerializeSeq<'a, W>;
303
304impl<'a, W> ser::SerializeTupleVariant for SerializeTupleVariant<'a, W>
305where
306 W: WriteInsn,
307{
308 type Ok = ();
309 type Error = Error;
310
311 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
312 where
313 T: ?Sized + ser::Serialize,
314 {
315 ser::SerializeSeq::serialize_element(self, value)
316 }
317
318 fn end(self) -> Result<()> {
319 self.ser.inner.write(Insn::Oadd)?;
320 ser::SerializeSeq::end(self)
321 }
322}
323
324pub struct SerializeMap<'a, W> {
325 ser: &'a mut Serializer<W>,
326}
327
328impl<'a, W> ser::SerializeMap for SerializeMap<'a, W>
329where
330 W: WriteInsn,
331{
332 type Ok = ();
333 type Error = Error;
334
335 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
336 where
337 T: ?Sized + ser::Serialize,
338 {
339 key.serialize(MapKeySerializer {
340 ser: &mut *self.ser,
341 })
342 }
343
344 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
345 where
346 T: ?Sized + ser::Serialize,
347 {
348 value.serialize(&mut *self.ser)?;
349 self.ser.inner.write(Insn::Oadd)?;
350 Ok(())
351 }
352
353 fn end(self) -> Result<()> {
354 Ok(())
355 }
356}
357
358type SerializeStruct<'a, W> = SerializeMap<'a, W>;
359
360impl<'a, W> ser::SerializeStruct for SerializeStruct<'a, W>
361where
362 W: WriteInsn,
363{
364 type Ok = ();
365 type Error = Error;
366
367 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
368 where
369 T: ?Sized + ser::Serialize,
370 {
371 ser::SerializeMap::serialize_key(&mut *self, key)?;
372 ser::SerializeMap::serialize_value(&mut *self, value)?;
373 Ok(())
374 }
375
376 fn end(self) -> Result<()> {
377 ser::SerializeMap::end(self)
378 }
379}
380
381type SerializeStructVariant<'a, W> = SerializeMap<'a, W>;
382
383impl<'a, W> ser::SerializeStructVariant for SerializeStructVariant<'a, W>
384where
385 W: WriteInsn,
386{
387 type Ok = ();
388 type Error = Error;
389
390 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
391 where
392 T: ?Sized + ser::Serialize,
393 {
394 ser::SerializeMap::serialize_entry(self, key, value)
395 }
396
397 fn end(self) -> Result<()> {
398 self.ser.inner.write(Insn::Oadd)?;
399 ser::SerializeMap::end(self)
400 }
401}
402
403struct MapKeySerializer<'a, W> {
404 ser: &'a mut Serializer<W>,
405}
406
407impl<'a, W> ser::Serializer for MapKeySerializer<'a, W>
408where
409 W: WriteInsn,
410{
411 type Ok = ();
412 type Error = Error;
413 type SerializeSeq = SerializeMapKeySeq<'a, W>;
414 type SerializeTuple = ser::Impossible<(), Error>;
415 type SerializeTupleStruct = ser::Impossible<(), Error>;
416 type SerializeTupleVariant = ser::Impossible<(), Error>;
417 type SerializeMap = ser::Impossible<(), Error>;
418 type SerializeStruct = ser::Impossible<(), Error>;
419 type SerializeStructVariant = ser::Impossible<(), Error>;
420
421 fn serialize_bool(self, v: bool) -> Result<()> {
422 if v {
423 self.ser.serialize_bytes(&[1])
424 } else {
425 self.ser.serialize_bytes(&[0])
426 }
427 }
428
429 fn serialize_i8(self, v: i8) -> Result<()> {
430 self.ser.serialize_bytes(&v.to_be_bytes())
431 }
432
433 fn serialize_i16(self, v: i16) -> Result<()> {
434 self.ser.serialize_bytes(&v.to_be_bytes())
435 }
436
437 fn serialize_i32(self, v: i32) -> Result<()> {
438 self.ser.serialize_bytes(&v.to_be_bytes())
439 }
440
441 fn serialize_i64(self, v: i64) -> Result<()> {
442 self.ser.serialize_bytes(&v.to_be_bytes())
443 }
444
445 fn serialize_u8(self, v: u8) -> Result<()> {
446 self.ser.serialize_bytes(&v.to_be_bytes())
447 }
448
449 fn serialize_u16(self, v: u16) -> Result<()> {
450 self.ser.serialize_bytes(&v.to_be_bytes())
451 }
452
453 fn serialize_u32(self, v: u32) -> Result<()> {
454 self.ser.serialize_bytes(&v.to_be_bytes())
455 }
456
457 fn serialize_u64(self, v: u64) -> Result<()> {
458 self.ser.serialize_bytes(&v.to_be_bytes())
459 }
460
461 fn serialize_f32(self, _v: f32) -> Result<()> {
462 Err(Error::key_must_be_bytes())
463 }
464
465 fn serialize_f64(self, _v: f64) -> Result<()> {
466 Err(Error::key_must_be_bytes())
467 }
468
469 fn serialize_char(self, v: char) -> Result<()> {
470 let mut buf = [0; 4];
471 self.ser.serialize_str(v.encode_utf8(&mut buf))
472 }
473
474 fn serialize_str(self, v: &str) -> Result<()> {
475 self.ser.serialize_str(v)
476 }
477
478 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
479 self.ser.serialize_bytes(v)
480 }
481
482 fn serialize_none(self) -> Result<()> {
483 Err(Error::key_must_be_bytes())
484 }
485
486 fn serialize_some<T>(self, _value: &T) -> Result<()>
487 where
488 T: ?Sized + ser::Serialize,
489 {
490 Err(Error::key_must_be_bytes())
491 }
492
493 fn serialize_unit(self) -> Result<()> {
494 Err(Error::key_must_be_bytes())
495 }
496
497 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
498 Err(Error::key_must_be_bytes())
499 }
500
501 fn serialize_unit_variant(
502 self,
503 _name: &'static str,
504 _variant_index: u32,
505 variant: &'static str,
506 ) -> Result<()> {
507 self.ser.serialize_str(variant)
508 }
509
510 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
511 where
512 T: ?Sized + ser::Serialize,
513 {
514 value.serialize(self)
515 }
516
517 fn serialize_newtype_variant<T>(
518 self,
519 _name: &'static str,
520 _variant_index: u32,
521 _variant: &'static str,
522 _value: &T,
523 ) -> Result<()>
524 where
525 T: ?Sized + ser::Serialize,
526 {
527 Err(Error::key_must_be_bytes())
528 }
529
530 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
531 self.ser.inner.write(Insn::Snew)?;
532 Ok(SerializeMapKeySeq {
533 ser: &mut *self.ser,
534 })
535 }
536
537 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
538 Err(Error::key_must_be_bytes())
539 }
540
541 fn serialize_tuple_struct(
542 self,
543 _name: &'static str,
544 _len: usize,
545 ) -> Result<Self::SerializeTupleStruct> {
546 Err(Error::key_must_be_bytes())
547 }
548
549 fn serialize_tuple_variant(
550 self,
551 _name: &'static str,
552 _variant_index: u32,
553 _variant: &'static str,
554 _len: usize,
555 ) -> Result<Self::SerializeTupleVariant> {
556 Err(Error::key_must_be_bytes())
557 }
558
559 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
560 Err(Error::key_must_be_bytes())
561 }
562
563 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
564 Err(Error::key_must_be_bytes())
565 }
566
567 fn serialize_struct_variant(
568 self,
569 _name: &'static str,
570 _variant_index: u32,
571 _variant: &'static str,
572 _len: usize,
573 ) -> Result<Self::SerializeStructVariant> {
574 Err(Error::key_must_be_bytes())
575 }
576}
577
578struct SerializeMapKeySeq<'a, W> {
579 ser: &'a mut Serializer<W>,
580}
581
582impl<'a, W> ser::SerializeSeq for SerializeMapKeySeq<'a, W>
583where
584 W: WriteInsn,
585{
586 type Ok = ();
587 type Error = Error;
588
589 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
590 where
591 T: ?Sized + ser::Serialize,
592 {
593 value.serialize(MapKeyBytesSerializer {
594 ser: &mut *self.ser,
595 })
596 }
597
598 fn end(self) -> Result<()> {
599 Ok(())
600 }
601}
602
603struct MapKeyBytesSerializer<'a, W> {
604 ser: &'a mut Serializer<W>,
605}
606
607impl<'a, W> ser::Serializer for MapKeyBytesSerializer<'a, W>
608where
609 W: WriteInsn,
610{
611 type Ok = ();
612 type Error = Error;
613 type SerializeSeq = ser::Impossible<(), Error>;
614 type SerializeTuple = ser::Impossible<(), Error>;
615 type SerializeTupleStruct = ser::Impossible<(), Error>;
616 type SerializeTupleVariant = ser::Impossible<(), Error>;
617 type SerializeMap = ser::Impossible<(), Error>;
618 type SerializeStruct = ser::Impossible<(), Error>;
619 type SerializeStructVariant = ser::Impossible<(), Error>;
620
621 fn serialize_bool(self, _v: bool) -> Result<()> {
622 Err(Error::key_must_be_bytes())
623 }
624
625 fn serialize_i8(self, _v: i8) -> Result<()> {
626 Err(Error::key_must_be_bytes())
627 }
628
629 fn serialize_i16(self, _v: i16) -> Result<()> {
630 Err(Error::key_must_be_bytes())
631 }
632
633 fn serialize_i32(self, _v: i32) -> Result<()> {
634 Err(Error::key_must_be_bytes())
635 }
636
637 fn serialize_i64(self, _v: i64) -> Result<()> {
638 Err(Error::key_must_be_bytes())
639 }
640
641 fn serialize_u8(self, v: u8) -> Result<()> {
642 self.ser.serialize_i8(v as i8)?;
643 self.ser.inner.write(Insn::Sadd)?;
644 Ok(())
645 }
646
647 fn serialize_u16(self, _v: u16) -> Result<()> {
648 Err(Error::key_must_be_bytes())
649 }
650
651 fn serialize_u32(self, _v: u32) -> Result<()> {
652 Err(Error::key_must_be_bytes())
653 }
654
655 fn serialize_u64(self, _v: u64) -> Result<()> {
656 Err(Error::key_must_be_bytes())
657 }
658
659 fn serialize_f32(self, _v: f32) -> Result<()> {
660 Err(Error::key_must_be_bytes())
661 }
662
663 fn serialize_f64(self, _v: f64) -> Result<()> {
664 Err(Error::key_must_be_bytes())
665 }
666
667 fn serialize_char(self, _v: char) -> Result<()> {
668 Err(Error::key_must_be_bytes())
669 }
670
671 fn serialize_str(self, _v: &str) -> Result<()> {
672 Err(Error::key_must_be_bytes())
673 }
674
675 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
676 Err(Error::key_must_be_bytes())
677 }
678
679 fn serialize_none(self) -> Result<()> {
680 Err(Error::key_must_be_bytes())
681 }
682
683 fn serialize_some<T>(self, _value: &T) -> Result<()>
684 where
685 T: ?Sized + ser::Serialize,
686 {
687 Err(Error::key_must_be_bytes())
688 }
689
690 fn serialize_unit(self) -> Result<()> {
691 Err(Error::key_must_be_bytes())
692 }
693
694 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
695 Err(Error::key_must_be_bytes())
696 }
697
698 fn serialize_unit_variant(
699 self,
700 _name: &'static str,
701 _variant_index: u32,
702 _variant: &'static str,
703 ) -> Result<()> {
704 Err(Error::key_must_be_bytes())
705 }
706
707 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
708 where
709 T: ?Sized + ser::Serialize,
710 {
711 Err(Error::key_must_be_bytes())
712 }
713
714 fn serialize_newtype_variant<T>(
715 self,
716 _name: &'static str,
717 _variant_index: u32,
718 _variant: &'static str,
719 _value: &T,
720 ) -> Result<()>
721 where
722 T: ?Sized + ser::Serialize,
723 {
724 Err(Error::key_must_be_bytes())
725 }
726
727 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
728 Err(Error::key_must_be_bytes())
729 }
730
731 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
732 Err(Error::key_must_be_bytes())
733 }
734
735 fn serialize_tuple_struct(
736 self,
737 _name: &'static str,
738 _len: usize,
739 ) -> Result<Self::SerializeTupleStruct> {
740 Err(Error::key_must_be_bytes())
741 }
742
743 fn serialize_tuple_variant(
744 self,
745 _name: &'static str,
746 _variant_index: u32,
747 _variant: &'static str,
748 _len: usize,
749 ) -> Result<Self::SerializeTupleVariant> {
750 Err(Error::key_must_be_bytes())
751 }
752
753 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
754 Err(Error::key_must_be_bytes())
755 }
756
757 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
758 Err(Error::key_must_be_bytes())
759 }
760
761 fn serialize_struct_variant(
762 self,
763 _name: &'static str,
764 _variant_index: u32,
765 _variant: &'static str,
766 _len: usize,
767 ) -> Result<Self::SerializeStructVariant> {
768 Err(Error::key_must_be_bytes())
769 }
770}
771
772#[cfg(test)]
773mod test {
774 use std::fmt;
775
776 use serde::ser::Serializer as SerdeSerializer;
777 use serde::Serialize;
778 use watson_rs::ToBytes;
779 use watson_rs::Value::*;
780 use watson_rs::{array, object};
781
782 use super::*;
783
784 #[test]
785 fn serialize_bool() {
786 assert_encodes(true, Bool(true));
787 assert_encodes(false, Bool(false));
788 }
789
790 #[test]
791 fn serialize_i8() {
792 assert_encodes(0_i8, Int(0));
793 assert_encodes(1_i8, Int(1));
794 assert_encodes(127_i8, Int(127));
795 assert_encodes(-1_i8, Int(-1));
796 assert_encodes(-128_i8, Int(-128));
797 }
798
799 #[test]
800 fn serialize_i16() {
801 assert_encodes(0_i16, Int(0));
802 assert_encodes(1_i16, Int(1));
803 assert_encodes(32767_i16, Int(32767));
804 assert_encodes(-1_i16, Int(-1));
805 assert_encodes(-32768_i16, Int(-32768));
806 }
807
808 #[test]
809 fn serialize_i32() {
810 assert_encodes(0_i32, Int(0));
811 assert_encodes(1_i32, Int(1));
812 assert_encodes(2147483647_i32, Int(2147483647));
813 assert_encodes(-1_i32, Int(-1));
814 assert_encodes(-2147483647_i32, Int(-2147483647));
815 }
816
817 #[test]
818 fn serialize_i64() {
819 assert_encodes(0_i64, Int(0));
820 assert_encodes(1_i64, Int(1));
821 assert_encodes(9223372036854775807_i64, Int(9223372036854775807_i64));
822 assert_encodes(-1_i64, Int(-1));
823 assert_encodes(-9223372036854775808_i64, Int(-9223372036854775808_i64));
824 }
825
826 #[test]
827 fn serialize_u8() {
828 assert_encodes(0_u8, Uint(0));
829 assert_encodes(1_u8, Uint(1));
830 assert_encodes(255_u8, Uint(255));
831 }
832
833 #[test]
834 fn serialize_u16() {
835 assert_encodes(0_u16, Uint(0));
836 assert_encodes(1_u16, Uint(1));
837 assert_encodes(65535_u16, Uint(65535));
838 }
839
840 #[test]
841 fn serialize_u32() {
842 assert_encodes(0_u32, Uint(0));
843 assert_encodes(1_u32, Uint(1));
844 assert_encodes(4294967295_u32, Uint(4294967295));
845 }
846
847 #[test]
848 fn serialize_u64() {
849 assert_encodes(0_u64, Uint(0));
850 assert_encodes(1_u64, Uint(1));
851 assert_encodes(18446744073709551615_u64, Uint(18446744073709551615));
852 }
853
854 #[test]
855 fn serialize_f32() {
856 assert_encodes_to_float_satisfying(f32::NAN, |f| f.is_nan());
857 assert_encodes_to_float_satisfying(f32::INFINITY, |f| {
858 f.is_sign_positive() && f.is_infinite()
859 });
860 assert_encodes_to_float_satisfying(f32::NEG_INFINITY, |f| {
861 f.is_sign_negative() && f.is_infinite()
862 });
863 assert_encodes(1.25_f32, Float(1.25));
864 assert_encodes(-1.25_f32, Float(-1.25));
865 }
866
867 #[test]
868 fn serialize_f64() {
869 assert_encodes_to_float_satisfying(f64::NAN, |f| f.is_nan());
870 assert_encodes_to_float_satisfying(f64::INFINITY, |f| {
871 f.is_sign_positive() && f.is_infinite()
872 });
873 assert_encodes_to_float_satisfying(f64::NEG_INFINITY, |f| {
874 f.is_sign_negative() && f.is_infinite()
875 });
876 assert_encodes(1.25e67_f64, Float(1.25e67));
877 assert_encodes(-1.25e-67_f64, Float(-1.25e-67));
878 }
879
880 #[test]
881 fn serialize_char() {
882 assert_encodes('a', String(b"a".to_vec()));
883 assert_encodes('あ', String("あ".to_bytes()));
884 }
885
886 #[test]
887 fn serialize_str() {
888 assert_encodes("", String("".to_bytes()));
889 assert_encodes("x", String("x".to_bytes()));
890 assert_encodes("こんにちは世界", String("こんにちは世界".to_bytes()));
891 assert_encodes("Привет, мир!", String("Привет, мир!".to_bytes()));
892 }
893
894 #[test]
895 fn serialize_bytes() {
896 assert_encodes_to_bytes(b"", String("".to_bytes()));
897 assert_encodes_to_bytes(b"1", String("1".to_bytes()));
898 assert_encodes_to_bytes(b"Hello, world!", String("Hello, world!".to_bytes()));
899 }
900
901 #[test]
902 fn serialize_none() {
903 assert_encodes(Option::<i32>::None, Nil);
904 }
905
906 #[test]
907 fn serialize_some() {
908 assert_encodes(Some(true), Bool(true));
909 assert_encodes(Some(123), Int(123));
910 }
911
912 #[test]
913 fn serialize_unit() {
914 assert_encodes((), Nil);
915 }
916
917 #[test]
918 fn serialize_unit_struct() {
919 #[derive(Debug, Serialize)]
920 struct S;
921
922 assert_encodes(S, Nil);
923 }
924
925 #[test]
926 fn serialize_unit_variant() {
927 #[derive(Debug, Serialize)]
928 enum E {
929 A,
930 B,
931 C,
932 }
933
934 assert_encodes(E::A, String(b"A".to_vec()));
935 assert_encodes(E::B, String(b"B".to_vec()));
936 assert_encodes(E::C, String(b"C".to_vec()));
937 }
938
939 #[test]
940 fn serialize_newtype_struct() {
941 #[derive(Debug, Serialize)]
942 struct S(i64);
943
944 assert_encodes(S(123), object![S: Int(123)])
945 }
946
947 #[test]
948 fn serialize_newtype_variant() {
949 #[derive(Debug, Serialize)]
950 enum E {
951 A(bool),
952 }
953
954 assert_encodes(E::A(false), object![A: Bool(false)]);
955 }
956
957 #[test]
958 fn serialize_seq() {
959 assert_encodes(vec![1, 2, 3], array![Int(1), Int(2), Int(3)]);
960 }
961
962 #[test]
963 fn serialize_tuple() {
964 assert_encodes(
965 (1, true, vec![2_u8, 3_u8]),
966 array![Int(1), Bool(true), array![Uint(2), Uint(3)]],
967 );
968 }
969
970 #[test]
971 fn serialize_tuple_struct() {
972 #[derive(Debug, Serialize)]
973 struct T(i32, bool, &'static str);
974
975 assert_encodes(
976 T(123, true, "foo"),
977 array![Int(123), Bool(true), String(b"foo".to_vec())],
978 );
979 }
980
981 #[test]
982 fn serialize_tuple_variant() {
983 #[derive(Debug, Serialize)]
984 enum E {
985 A(i32, bool),
986 B(u64, ()),
987 }
988
989 assert_encodes(E::A(123, true), object![A: array![Int(123), Bool(true)]]);
990 assert_encodes(E::B(456, ()), object![B: array![Uint(456), Nil]]);
991 }
992
993 #[test]
994 fn serialize_map_key_bool() {
995 type HM<T> = std::collections::HashMap<bool, T>;
996
997 assert_encodes(HM::<i32>::new(), object![]);
998 assert_encodes(
999 [(true, "true"), (false, "false")]
1000 .into_iter()
1001 .collect::<HM<&'static str>>(),
1002 object![
1003 [b"\x01"]: String(b"true".to_vec()),
1004 [b"\x00"]: String(b"false".to_vec()),
1005 ],
1006 )
1007 }
1008
1009 #[test]
1010 fn serialize_map_key_i8() {
1011 type HM<T> = std::collections::HashMap<i8, T>;
1012
1013 assert_encodes(HM::<i32>::new(), object![]);
1014 assert_encodes(
1015 [(0, "A"), (0x7f, "B"), (-0x80, "C")]
1016 .into_iter()
1017 .collect::<HM<&'static str>>(),
1018 object![
1019 [b"\x00"]: String(b"A".to_vec()),
1020 [b"\x7f"]: String(b"B".to_vec()),
1021 [b"\x80"]: String(b"C".to_vec()),
1022 ],
1023 )
1024 }
1025
1026 #[test]
1027 fn serialize_map_key_i16() {
1028 type HM<T> = std::collections::HashMap<i16, T>;
1029
1030 assert_encodes(HM::<i32>::new(), object![]);
1031 assert_encodes(
1032 [(0, "A"), (0x7fff, "B"), (-0x8000, "C")]
1033 .into_iter()
1034 .collect::<HM<&'static str>>(),
1035 object![
1036 [b"\x00\x00"]: String(b"A".to_vec()),
1037 [b"\x7f\xff"]: String(b"B".to_vec()),
1038 [b"\x80\x00"]: String(b"C".to_vec()),
1039 ],
1040 )
1041 }
1042
1043 #[test]
1044 fn serialize_map_key_i32() {
1045 type HM<T> = std::collections::HashMap<i32, T>;
1046
1047 assert_encodes(HM::<i32>::new(), object![]);
1048 assert_encodes(
1049 [(0, "A"), (0x7fff_ffff, "B"), (-0x8000_0000, "C")]
1050 .into_iter()
1051 .collect::<HM<&'static str>>(),
1052 object![
1053 [b"\x00\x00\x00\x00"]: String(b"A".to_vec()),
1054 [b"\x7f\xff\xff\xff"]: String(b"B".to_vec()),
1055 [b"\x80\x00\x00\x00"]: String(b"C".to_vec()),
1056 ],
1057 )
1058 }
1059
1060 #[test]
1061 fn serialize_map_key_i64() {
1062 type HM<T> = std::collections::HashMap<i64, T>;
1063
1064 assert_encodes(HM::<i32>::new(), object![]);
1065 assert_encodes(
1066 [
1067 (0, "A"),
1068 (0x7fff_ffff_ffff_ffff, "B"),
1069 (-0x8000_0000_0000_0000, "C"),
1070 ]
1071 .into_iter()
1072 .collect::<HM<&'static str>>(),
1073 object![
1074 [b"\x00\x00\x00\x00\x00\x00\x00\x00"]: String(b"A".to_vec()),
1075 [b"\x7f\xff\xff\xff\xff\xff\xff\xff"]: String(b"B".to_vec()),
1076 [b"\x80\x00\x00\x00\x00\x00\x00\x00"]: String(b"C".to_vec()),
1077 ],
1078 )
1079 }
1080
1081 #[test]
1082 fn serialize_map_key_u8() {
1083 type HM<T> = std::collections::HashMap<u8, T>;
1084
1085 assert_encodes(HM::<i32>::new(), object![]);
1086 assert_encodes(
1087 [(0, "A"), (0x7f, "B"), (0xff, "C")]
1088 .into_iter()
1089 .collect::<HM<&'static str>>(),
1090 object![
1091 [b"\x00"]: String(b"A".to_vec()),
1092 [b"\x7f"]: String(b"B".to_vec()),
1093 [b"\xff"]: String(b"C".to_vec()),
1094 ],
1095 )
1096 }
1097
1098 #[test]
1099 fn serialize_map_key_u16() {
1100 type HM<T> = std::collections::HashMap<u16, T>;
1101
1102 assert_encodes(HM::<i32>::new(), object![]);
1103 assert_encodes(
1104 [(0, "A"), (0x7fff, "B"), (0xffff, "C")]
1105 .into_iter()
1106 .collect::<HM<&'static str>>(),
1107 object![
1108 [b"\x00\x00"]: String(b"A".to_vec()),
1109 [b"\x7f\xff"]: String(b"B".to_vec()),
1110 [b"\xff\xff"]: String(b"C".to_vec()),
1111 ],
1112 )
1113 }
1114
1115 #[test]
1116 fn serialize_map_key_u32() {
1117 type HM<T> = std::collections::HashMap<u32, T>;
1118
1119 assert_encodes(HM::<i32>::new(), object![]);
1120 assert_encodes(
1121 [(0, "A"), (0x7fff_ffff, "B"), (0xffff_ffff, "C")]
1122 .into_iter()
1123 .collect::<HM<&'static str>>(),
1124 object![
1125 [b"\x00\x00\x00\x00"]: String(b"A".to_vec()),
1126 [b"\x7f\xff\xff\xff"]: String(b"B".to_vec()),
1127 [b"\xff\xff\xff\xff"]: String(b"C".to_vec()),
1128 ],
1129 )
1130 }
1131
1132 #[test]
1133 fn serialize_map_key_u64() {
1134 type HM<T> = std::collections::HashMap<u64, T>;
1135
1136 assert_encodes(HM::<i32>::new(), object![]);
1137 assert_encodes(
1138 [
1139 (0, "A"),
1140 (0x7fff_ffff_ffff_ffff, "B"),
1141 (0xffff_ffff_ffff_ffff, "C"),
1142 ]
1143 .into_iter()
1144 .collect::<HM<&'static str>>(),
1145 object![
1146 [b"\x00\x00\x00\x00\x00\x00\x00\x00"]: String(b"A".to_vec()),
1147 [b"\x7f\xff\xff\xff\xff\xff\xff\xff"]: String(b"B".to_vec()),
1148 [b"\xff\xff\xff\xff\xff\xff\xff\xff"]: String(b"C".to_vec()),
1149 ],
1150 )
1151 }
1152
1153 #[test]
1154 fn serialize_map_key_char() {
1155 type HM<T> = std::collections::HashMap<char, T>;
1156
1157 assert_encodes(HM::<i32>::new(), object![]);
1158 assert_encodes(
1159 [('A', 1), ('B', 2), ('参', 3)]
1160 .into_iter()
1161 .collect::<HM<i32>>(),
1162 object![
1163 [b"A"]: Int(1),
1164 [b"B"]: Int(2),
1165 [b"\xe5\x8f\x82"]: Int(3),
1166 ],
1167 );
1168 }
1169
1170 #[test]
1171 fn serialize_map_key_str() {
1172 type HM<T> = std::collections::HashMap<&'static str, T>;
1173
1174 assert_encodes(HM::<i32>::new(), object![]);
1175 assert_encodes(
1176 [("foo", "bar")].into_iter().collect::<HM<&'static str>>(),
1177 object![foo: String(b"bar".to_vec())],
1178 );
1179 assert_encodes(
1180 [("foo", 123), ("bar", 456), ("", 789)]
1181 .into_iter()
1182 .collect::<HM<i32>>(),
1183 object![foo: Int(123), bar: Int(456), [b""]: Int(789)],
1184 );
1185 }
1186
1187 #[test]
1188 fn serialize_map_key_bytes() {
1189 type HM<T> = std::collections::HashMap<Vec<u8>, T>;
1190
1191 assert_encodes(HM::<i32>::new(), object![]);
1192 assert_encodes(
1193 [("foo".to_bytes(), "bar")]
1194 .into_iter()
1195 .collect::<HM<&'static str>>(),
1196 object![foo: String(b"bar".to_vec())],
1197 );
1198 assert_encodes(
1199 [
1200 ("foo".to_bytes(), 123),
1201 ("bar".to_bytes(), 456),
1202 ("".to_bytes(), 789),
1203 ]
1204 .into_iter()
1205 .collect::<HM<i32>>(),
1206 object![foo: Int(123), bar: Int(456), [b""]: Int(789)],
1207 );
1208 }
1209
1210 #[test]
1211 fn serialize_map_key_unit_variant() {
1212 #[derive(Eq, PartialEq, Hash, Debug, Serialize)]
1213 enum Key {
1214 A,
1215 B,
1216 }
1217 type HM<T> = std::collections::HashMap<Key, T>;
1218
1219 assert_encodes(
1220 [(Key::A, 123), (Key::B, 456)]
1221 .into_iter()
1222 .collect::<HM<i32>>(),
1223 object![A: Int(123), B: Int(456)],
1224 );
1225 }
1226
1227 #[test]
1228 fn serialize_map_key_newtype_struct() {
1229 #[derive(Eq, PartialEq, Hash, Debug, Serialize)]
1230 struct Key(&'static str);
1231 type HM<T> = std::collections::HashMap<Key, T>;
1232
1233 assert_encodes(
1234 [(Key("foo"), 123), (Key("bar"), 456)]
1235 .into_iter()
1236 .collect::<HM<i32>>(),
1237 object![foo: Int(123), bar: Int(456)],
1238 );
1239 }
1240
1241 #[test]
1242 fn serialize_struct() {
1243 #[derive(Debug, Serialize)]
1244 struct S {
1245 f1: i32,
1246 f2: &'static str,
1247 f3: bool,
1248 }
1249
1250 assert_encodes(
1251 S {
1252 f1: 123,
1253 f2: "abc",
1254 f3: true,
1255 },
1256 object![f1: Int(123), f2: String(b"abc".to_vec()), f3: Bool(true)],
1257 )
1258 }
1259
1260 #[test]
1261 fn serialize_struct_variant() {
1262 #[derive(Debug, Serialize)]
1263 enum E {
1264 S { f1: u32, f2: i32 },
1265 }
1266
1267 assert_encodes(
1268 E::S { f1: 123, f2: 456 },
1269 object![S: object![f1: Uint(123), f2: Int(456)]],
1270 );
1271 }
1272
1273 fn assert_encodes<T>(x: T, expected: watson_rs::Value)
1278 where
1279 T: fmt::Debug + ser::Serialize,
1280 {
1281 let actual = encode_then_decode(x);
1282 assert_eq!(actual, expected);
1283 }
1284
1285 fn assert_encodes_to_float_satisfying<T, F>(x: T, pred: F)
1286 where
1287 T: fmt::Debug + ser::Serialize,
1288 F: FnOnce(f64) -> bool,
1289 {
1290 match encode_then_decode(x) {
1291 Float(f) => {
1292 assert!(pred(f));
1293 }
1294 actual => {
1295 panic!("expected float but got {:?}", actual);
1296 }
1297 }
1298 }
1299
1300 fn assert_encodes_to_bytes(s: &[u8], expected: watson_rs::Value) {
1301 let mut buf = vec![];
1302 let mut ser = Serializer::new(&mut buf);
1303 ser.serialize_bytes(s).expect("serialization error");
1304 assert_eq!(decode(&mut buf.into_iter()), expected);
1305 }
1306
1307 fn encode_then_decode<T>(x: T) -> watson_rs::Value
1308 where
1309 T: ser::Serialize,
1310 {
1311 let mut buf = vec![];
1312 let mut ser = Serializer::new(&mut buf);
1313
1314 x.serialize(&mut ser).expect("selialization error");
1315
1316 decode(&mut buf.into_iter())
1317 }
1318
1319 fn decode<It>(it: &mut It) -> watson_rs::Value
1320 where
1321 It: Iterator<Item = watson_rs::Insn>,
1322 {
1323 let mut vm = watson_rs::VM::new();
1324 vm.execute_all(watson_rs::vm::SliceTokenReader::new(
1325 &it.collect::<Vec<watson_rs::Insn>>(),
1326 ))
1327 .expect("execution error");
1328 vm.peek_top().expect("stack should not be empty").clone()
1329 }
1330}