1use crate::{
20 bytes::{BytesType, SER_BYTES_TYPE},
21 types::Value,
22 Error,
23};
24use serde::{ser, Serialize};
25use std::{collections::HashMap, iter::once};
26
27#[derive(Clone, Default)]
28pub struct Serializer {}
29
30pub struct SeqSerializer {
31 items: Vec<Value>,
32}
33
34pub struct SeqVariantSerializer<'a> {
35 index: u32,
36 variant: &'a str,
37 items: Vec<Value>,
38}
39
40pub struct MapSerializer {
41 indices: HashMap<String, usize>,
42 values: Vec<Value>,
43}
44
45pub struct StructSerializer {
46 fields: Vec<(String, Value)>,
47}
48
49pub struct StructVariantSerializer<'a> {
50 index: u32,
51 variant: &'a str,
52 fields: Vec<(String, Value)>,
53}
54
55impl SeqSerializer {
56 pub fn new(len: Option<usize>) -> SeqSerializer {
57 let items = match len {
58 Some(len) => Vec::with_capacity(len),
59 None => Vec::new(),
60 };
61
62 SeqSerializer { items }
63 }
64}
65
66impl<'a> SeqVariantSerializer<'a> {
67 pub fn new(index: u32, variant: &'a str, len: Option<usize>) -> SeqVariantSerializer {
68 let items = match len {
69 Some(len) => Vec::with_capacity(len),
70 None => Vec::new(),
71 };
72 SeqVariantSerializer {
73 index,
74 variant,
75 items,
76 }
77 }
78}
79
80impl MapSerializer {
81 pub fn new(len: Option<usize>) -> MapSerializer {
82 let (indices, values) = match len {
83 Some(len) => (HashMap::with_capacity(len), Vec::with_capacity(len)),
84 None => (HashMap::new(), Vec::new()),
85 };
86
87 MapSerializer { indices, values }
88 }
89}
90
91impl StructSerializer {
92 pub fn new(len: usize) -> StructSerializer {
93 StructSerializer {
94 fields: Vec::with_capacity(len),
95 }
96 }
97}
98
99impl<'a> StructVariantSerializer<'a> {
100 pub fn new(index: u32, variant: &'a str, len: usize) -> StructVariantSerializer {
101 StructVariantSerializer {
102 index,
103 variant,
104 fields: Vec::with_capacity(len),
105 }
106 }
107}
108
109impl<'b> ser::Serializer for &'b mut Serializer {
110 type Ok = Value;
111 type Error = Error;
112 type SerializeSeq = SeqSerializer;
113 type SerializeTuple = SeqSerializer;
114 type SerializeTupleStruct = SeqSerializer;
115 type SerializeTupleVariant = SeqVariantSerializer<'b>;
116 type SerializeMap = MapSerializer;
117 type SerializeStruct = StructSerializer;
118 type SerializeStructVariant = StructVariantSerializer<'b>;
119
120 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
121 Ok(Value::Boolean(v))
122 }
123
124 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
125 self.serialize_i32(i32::from(v))
126 }
127
128 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
129 self.serialize_i32(i32::from(v))
130 }
131
132 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
133 Ok(Value::Int(v))
134 }
135
136 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
137 Ok(Value::Long(v))
138 }
139
140 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
141 self.serialize_i32(i32::from(v))
142 }
143
144 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
145 self.serialize_i32(i32::from(v))
146 }
147
148 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
149 if v <= i32::MAX as u32 {
150 self.serialize_i32(v as i32)
151 } else {
152 self.serialize_i64(i64::from(v))
153 }
154 }
155
156 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
157 if v <= i64::MAX as u64 {
158 self.serialize_i64(v as i64)
159 } else {
160 Err(ser::Error::custom("u64 is too large"))
161 }
162 }
163
164 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
165 Ok(Value::Float(v))
166 }
167
168 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
169 Ok(Value::Double(v))
170 }
171
172 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
173 self.serialize_str(&once(v).collect::<String>())
174 }
175
176 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
177 Ok(Value::String(v.to_owned()))
178 }
179
180 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
181 match SER_BYTES_TYPE.get() {
182 BytesType::Bytes => Ok(Value::Bytes(v.to_owned())),
183 BytesType::Fixed => Ok(Value::Fixed(v.len(), v.to_owned())),
184 }
185 }
186
187 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
188 Ok(Value::from(None::<Self::Ok>))
189 }
190
191 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
192 where
193 T: Serialize + ?Sized,
194 {
195 let v = value.serialize(&mut Serializer::default())?;
196 Ok(Value::from(Some(v)))
197 }
198
199 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
200 Ok(Value::Null)
201 }
202
203 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
204 self.serialize_unit()
205 }
206
207 fn serialize_unit_variant(
208 self,
209 _: &'static str,
210 _variant_index: u32,
211 variant: &'static str,
212 ) -> Result<Self::Ok, Self::Error> {
213 Ok(Value::String(variant.to_string()))
214 }
215
216 fn serialize_newtype_struct<T>(
217 self,
218 _: &'static str,
219 value: &T,
220 ) -> Result<Self::Ok, Self::Error>
221 where
222 T: Serialize + ?Sized,
223 {
224 value.serialize(self)
225 }
226
227 fn serialize_newtype_variant<T>(
228 self,
229 _: &'static str,
230 index: u32,
231 variant: &'static str,
232 value: &T,
233 ) -> Result<Self::Ok, Self::Error>
234 where
235 T: Serialize + ?Sized,
236 {
237 Ok(Value::Record(vec![
238 ("type".to_owned(), Value::Enum(index, variant.to_owned())),
239 (
240 "value".to_owned(),
241 Value::Union(index, Box::new(value.serialize(self)?)),
242 ),
243 ]))
244 }
245
246 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
247 Ok(SeqSerializer::new(len))
248 }
249
250 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
251 self.serialize_seq(Some(len))
252 }
253
254 fn serialize_tuple_struct(
255 self,
256 _: &'static str,
257 len: usize,
258 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
259 self.serialize_seq(Some(len))
260 }
261
262 fn serialize_tuple_variant(
263 self,
264 _: &'static str,
265 index: u32,
266 variant: &'static str,
267 len: usize,
268 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
269 Ok(SeqVariantSerializer::new(index, variant, Some(len)))
270 }
271
272 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
273 Ok(MapSerializer::new(len))
274 }
275
276 fn serialize_struct(
277 self,
278 _: &'static str,
279 len: usize,
280 ) -> Result<Self::SerializeStruct, Self::Error> {
281 Ok(StructSerializer::new(len))
282 }
283
284 fn serialize_struct_variant(
285 self,
286 _: &'static str,
287 index: u32,
288 variant: &'static str,
289 len: usize,
290 ) -> Result<Self::SerializeStructVariant, Self::Error> {
291 Ok(StructVariantSerializer::new(index, variant, len))
292 }
293
294 fn is_human_readable(&self) -> bool {
295 crate::util::is_human_readable()
296 }
297}
298
299impl ser::SerializeSeq for SeqSerializer {
300 type Ok = Value;
301 type Error = Error;
302
303 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
304 where
305 T: Serialize + ?Sized,
306 {
307 self.items
308 .push(value.serialize(&mut Serializer::default())?);
309 Ok(())
310 }
311
312 fn end(self) -> Result<Self::Ok, Self::Error> {
313 Ok(Value::Array(self.items))
314 }
315}
316
317impl ser::SerializeTuple for SeqSerializer {
318 type Ok = Value;
319 type Error = Error;
320
321 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
322 where
323 T: Serialize + ?Sized,
324 {
325 ser::SerializeSeq::serialize_element(self, value)
326 }
327
328 fn end(self) -> Result<Self::Ok, Self::Error> {
329 ser::SerializeSeq::end(self)
330 }
331}
332
333impl ser::SerializeTupleStruct for SeqSerializer {
334 type Ok = Value;
335 type Error = Error;
336
337 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
338 where
339 T: Serialize + ?Sized,
340 {
341 ser::SerializeSeq::serialize_element(self, value)
342 }
343
344 fn end(self) -> Result<Self::Ok, Self::Error> {
345 ser::SerializeSeq::end(self)
346 }
347}
348
349impl<'a> ser::SerializeSeq for SeqVariantSerializer<'a> {
350 type Ok = Value;
351 type Error = Error;
352
353 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
354 where
355 T: Serialize + ?Sized,
356 {
357 self.items.push(Value::Union(
358 self.index,
359 Box::new(value.serialize(&mut Serializer::default())?),
360 ));
361 Ok(())
362 }
363
364 fn end(self) -> Result<Self::Ok, Self::Error> {
365 Ok(Value::Record(vec![
366 (
367 "type".to_owned(),
368 Value::Enum(self.index, self.variant.to_owned()),
369 ),
370 ("value".to_owned(), Value::Array(self.items)),
371 ]))
372 }
373}
374
375impl<'a> ser::SerializeTupleVariant for SeqVariantSerializer<'a> {
376 type Ok = Value;
377 type Error = Error;
378
379 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
380 where
381 T: Serialize + ?Sized,
382 {
383 ser::SerializeSeq::serialize_element(self, value)
384 }
385
386 fn end(self) -> Result<Self::Ok, Self::Error> {
387 ser::SerializeSeq::end(self)
388 }
389}
390
391impl ser::SerializeMap for MapSerializer {
392 type Ok = Value;
393 type Error = Error;
394
395 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
396 where
397 T: Serialize + ?Sized,
398 {
399 let key = key.serialize(&mut Serializer::default())?;
400
401 if let Value::String(key) = key {
402 self.indices.insert(key, self.values.len());
403 Ok(())
404 } else {
405 Err(ser::Error::custom("map key is not a string"))
406 }
407 }
408
409 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
410 where
411 T: Serialize + ?Sized,
412 {
413 self.values
414 .push(value.serialize(&mut Serializer::default())?);
415 Ok(())
416 }
417
418 fn end(self) -> Result<Self::Ok, Self::Error> {
419 let mut items = HashMap::new();
420 for (key, index) in self.indices {
421 if let Some(value) = self.values.get(index) {
422 items.insert(key, value.clone());
423 }
424 }
425
426 Ok(Value::Map(items))
427 }
428}
429
430impl ser::SerializeStruct for StructSerializer {
431 type Ok = Value;
432 type Error = Error;
433
434 fn serialize_field<T>(&mut self, name: &'static str, value: &T) -> Result<(), Self::Error>
435 where
436 T: Serialize + ?Sized,
437 {
438 self.fields.push((
439 name.to_owned(),
440 value.serialize(&mut Serializer::default())?,
441 ));
442 Ok(())
443 }
444
445 fn end(self) -> Result<Self::Ok, Self::Error> {
446 Ok(Value::Record(self.fields))
447 }
448}
449
450impl<'a> ser::SerializeStructVariant for StructVariantSerializer<'a> {
451 type Ok = Value;
452 type Error = Error;
453
454 fn serialize_field<T>(&mut self, name: &'static str, value: &T) -> Result<(), Self::Error>
455 where
456 T: Serialize + ?Sized,
457 {
458 self.fields.push((
459 name.to_owned(),
460 value.serialize(&mut Serializer::default())?,
461 ));
462 Ok(())
463 }
464
465 fn end(self) -> Result<Self::Ok, Self::Error> {
466 Ok(Value::Record(vec![
467 (
468 "type".to_owned(),
469 Value::Enum(self.index, self.variant.to_owned()),
470 ),
471 (
472 "value".to_owned(),
473 Value::Union(self.index, Box::new(Value::Record(self.fields))),
474 ),
475 ]))
476 }
477}
478
479pub fn to_value<S: Serialize>(value: S) -> Result<Value, Error> {
484 let mut serializer = Serializer::default();
485 value.serialize(&mut serializer)
486}
487
488#[cfg(test)]
489mod tests {
490 use super::*;
491 use apache_avro_test_helper::TestResult;
492 use pretty_assertions::assert_eq;
493 use serde::{Deserialize, Serialize};
494 use serial_test::serial;
495 use std::sync::atomic::Ordering;
496
497 #[derive(Debug, Deserialize, Serialize, Clone)]
498 struct Test {
499 a: i64,
500 b: String,
501 }
502
503 #[derive(Debug, Deserialize, Serialize)]
504 struct TestInner {
505 a: Test,
506 b: i32,
507 }
508
509 #[derive(Debug, Deserialize, Serialize)]
510 struct TestUnitExternalEnum {
511 a: UnitExternalEnum,
512 }
513
514 #[derive(Debug, Deserialize, Serialize)]
515 enum UnitExternalEnum {
516 Val1,
517 Val2,
518 }
519
520 #[derive(Debug, Deserialize, Serialize)]
521 struct TestUnitInternalEnum {
522 a: UnitInternalEnum,
523 }
524
525 #[derive(Debug, Deserialize, Serialize)]
526 #[serde(tag = "t")]
527 enum UnitInternalEnum {
528 Val1,
529 Val2,
530 }
531
532 #[derive(Debug, Deserialize, Serialize)]
533 struct TestUnitAdjacentEnum {
534 a: UnitAdjacentEnum,
535 }
536
537 #[derive(Debug, Deserialize, Serialize)]
538 #[serde(tag = "t", content = "v")]
539 enum UnitAdjacentEnum {
540 Val1,
541 Val2,
542 }
543
544 #[derive(Debug, Deserialize, Serialize)]
545 struct TestUnitUntaggedEnum {
546 a: UnitUntaggedEnum,
547 }
548
549 #[derive(Debug, Deserialize, Serialize)]
550 #[serde(untagged)]
551 enum UnitUntaggedEnum {
552 Val1,
553 Val2,
554 }
555
556 #[derive(Debug, Serialize, Deserialize)]
557 struct TestSingleValueExternalEnum {
558 a: SingleValueExternalEnum,
559 }
560
561 #[derive(Debug, Serialize, Deserialize)]
562 enum SingleValueExternalEnum {
563 Double(f64),
564 String(String),
565 }
566
567 #[derive(Debug, Serialize, Deserialize)]
568 struct TestSingleValueInternalEnum {
569 a: SingleValueInternalEnum,
570 }
571
572 #[derive(Debug, Serialize, Deserialize)]
573 #[serde(tag = "t")]
574 enum SingleValueInternalEnum {
575 Double(f64),
576 String(String),
577 }
578
579 #[derive(Debug, Serialize, Deserialize)]
580 struct TestSingleValueAdjacentEnum {
581 a: SingleValueAdjacentEnum,
582 }
583 #[derive(Debug, Serialize, Deserialize)]
584 #[serde(tag = "t", content = "v")]
585 enum SingleValueAdjacentEnum {
586 Double(f64),
587 String(String),
588 }
589
590 #[derive(Debug, Serialize, Deserialize)]
591 struct TestSingleValueUntaggedEnum {
592 a: SingleValueUntaggedEnum,
593 }
594
595 #[derive(Debug, Serialize, Deserialize)]
596 #[serde(untagged)]
597 enum SingleValueUntaggedEnum {
598 Double(f64),
599 String(String),
600 }
601
602 #[derive(Debug, Serialize, Deserialize)]
603 struct TestStructExternalEnum {
604 a: StructExternalEnum,
605 }
606
607 #[derive(Debug, Serialize, Deserialize)]
608 enum StructExternalEnum {
609 Val1 { x: f32, y: f32 },
610 Val2 { x: f32, y: f32 },
611 }
612
613 #[derive(Debug, Serialize, Deserialize)]
614 struct TestStructInternalEnum {
615 a: StructInternalEnum,
616 }
617
618 #[derive(Debug, Serialize, Deserialize)]
619 #[serde(tag = "type")]
620 enum StructInternalEnum {
621 Val1 { x: f32, y: f32 },
622 Val2 { x: f32, y: f32 },
623 }
624
625 #[derive(Debug, Serialize, Deserialize)]
626 struct TestStructAdjacentEnum {
627 a: StructAdjacentEnum,
628 }
629
630 #[derive(Debug, Serialize, Deserialize)]
631 #[serde(tag = "t", content = "v")]
632 enum StructAdjacentEnum {
633 Val1 { x: f32, y: f32 },
634 Val2 { x: f32, y: f32 },
635 }
636
637 #[derive(Debug, Serialize, Deserialize)]
638 struct TestStructUntaggedEnum {
639 a: StructUntaggedEnum,
640 }
641
642 #[derive(Debug, Serialize, Deserialize)]
643 #[serde(untagged)]
644 enum StructUntaggedEnum {
645 Val1 { x: f32, y: f32 },
646 Val2 { x: f32, y: f32, z: f32 },
647 }
648
649 #[derive(Debug, Serialize, Deserialize)]
650 struct TestTupleExternalEnum {
651 a: TupleExternalEnum,
652 }
653
654 #[derive(Debug, Serialize, Deserialize)]
655 enum TupleExternalEnum {
656 Val1(f32, f32),
657 Val2(f32, f32, f32),
658 }
659
660 #[derive(Debug, Serialize, Deserialize)]
663 struct TestTupleAdjacentEnum {
664 a: TupleAdjacentEnum,
665 }
666
667 #[derive(Debug, Serialize, Deserialize)]
668 #[serde(tag = "t", content = "v")]
669 enum TupleAdjacentEnum {
670 Val1(f32, f32),
671 Val2(f32, f32, f32),
672 }
673
674 #[derive(Debug, Serialize, Deserialize)]
675 struct TestTupleUntaggedEnum {
676 a: TupleUntaggedEnum,
677 }
678
679 #[derive(Debug, Serialize, Deserialize)]
680 #[serde(untagged)]
681 enum TupleUntaggedEnum {
682 Val1(f32, f32),
683 Val2(f32, f32, f32),
684 }
685
686 #[test]
687 fn test_to_value() -> TestResult {
688 let test = Test {
689 a: 27,
690 b: "foo".to_owned(),
691 };
692 let expected = Value::Record(vec![
693 ("a".to_owned(), Value::Long(27)),
694 ("b".to_owned(), Value::String("foo".to_owned())),
695 ]);
696
697 assert_eq!(to_value(test.clone())?, expected);
698
699 let test_inner = TestInner { a: test, b: 35 };
700
701 let expected_inner = Value::Record(vec![
702 (
703 "a".to_owned(),
704 Value::Record(vec![
705 ("a".to_owned(), Value::Long(27)),
706 ("b".to_owned(), Value::String("foo".to_owned())),
707 ]),
708 ),
709 ("b".to_owned(), Value::Int(35)),
710 ]);
711
712 assert_eq!(to_value(test_inner)?, expected_inner);
713
714 Ok(())
715 }
716
717 #[test]
718 fn test_to_value_unit_enum() -> TestResult {
719 let test = TestUnitExternalEnum {
720 a: UnitExternalEnum::Val1,
721 };
722
723 let expected = Value::Record(vec![("a".to_owned(), Value::String("Val1".to_owned()))]);
724
725 assert_eq!(
726 to_value(test)?,
727 expected,
728 "Error serializing unit external enum"
729 );
730
731 let test = TestUnitInternalEnum {
732 a: UnitInternalEnum::Val1,
733 };
734
735 let expected = Value::Record(vec![(
736 "a".to_owned(),
737 Value::Record(vec![("t".to_owned(), Value::String("Val1".to_owned()))]),
738 )]);
739
740 assert_eq!(
741 to_value(test)?,
742 expected,
743 "Error serializing unit internal enum"
744 );
745
746 let test = TestUnitAdjacentEnum {
747 a: UnitAdjacentEnum::Val1,
748 };
749
750 let expected = Value::Record(vec![(
751 "a".to_owned(),
752 Value::Record(vec![("t".to_owned(), Value::String("Val1".to_owned()))]),
753 )]);
754
755 assert_eq!(
756 to_value(test)?,
757 expected,
758 "Error serializing unit adjacent enum"
759 );
760
761 let test = TestUnitUntaggedEnum {
762 a: UnitUntaggedEnum::Val1,
763 };
764
765 let expected = Value::Record(vec![("a".to_owned(), Value::Null)]);
766
767 assert_eq!(
768 to_value(test)?,
769 expected,
770 "Error serializing unit untagged enum"
771 );
772
773 Ok(())
774 }
775
776 #[test]
777 fn test_to_value_single_value_enum() -> TestResult {
778 let test = TestSingleValueExternalEnum {
779 a: SingleValueExternalEnum::Double(64.0),
780 };
781
782 let expected = Value::Record(vec![(
783 "a".to_owned(),
784 Value::Record(vec![
785 ("type".to_owned(), Value::Enum(0, "Double".to_owned())),
786 (
787 "value".to_owned(),
788 Value::Union(0, Box::new(Value::Double(64.0))),
789 ),
790 ]),
791 )]);
792
793 assert_eq!(
794 to_value(test)?,
795 expected,
796 "Error serializing single value external enum"
797 );
798
799 let test = TestSingleValueInternalEnum {
801 a: SingleValueInternalEnum::Double(64.0),
802 };
803
804 assert!(to_value(test).is_err(), "{}", true);
805
806 let test = TestSingleValueAdjacentEnum {
807 a: SingleValueAdjacentEnum::Double(64.0),
808 };
809
810 let expected = Value::Record(vec![(
811 "a".to_owned(),
812 Value::Record(vec![
813 ("t".to_owned(), Value::String("Double".to_owned())),
814 ("v".to_owned(), Value::Double(64.0)),
815 ]),
816 )]);
817
818 assert_eq!(
819 to_value(test)?,
820 expected,
821 "Error serializing single value adjacent enum"
822 );
823
824 let test = TestSingleValueUntaggedEnum {
825 a: SingleValueUntaggedEnum::Double(64.0),
826 };
827
828 let expected = Value::Record(vec![("a".to_owned(), Value::Double(64.0))]);
829
830 assert_eq!(
831 to_value(test)?,
832 expected,
833 "Error serializing single value untagged enum"
834 );
835
836 Ok(())
837 }
838
839 #[test]
840 fn test_to_value_struct_enum() -> TestResult {
841 let test = TestStructExternalEnum {
842 a: StructExternalEnum::Val1 { x: 1.0, y: 2.0 },
843 };
844 let expected = Value::Record(vec![(
845 "a".to_owned(),
846 Value::Record(vec![
847 ("type".to_owned(), Value::Enum(0, "Val1".to_owned())),
848 (
849 "value".to_owned(),
850 Value::Union(
851 0,
852 Box::new(Value::Record(vec![
853 ("x".to_owned(), Value::Float(1.0)),
854 ("y".to_owned(), Value::Float(2.0)),
855 ])),
856 ),
857 ),
858 ]),
859 )]);
860
861 assert_eq!(
862 to_value(test)?,
863 expected,
864 "error serializing struct external enum"
865 );
866
867 let test = TestStructInternalEnum {
870 a: StructInternalEnum::Val1 { x: 1.0, y: 2.0 },
871 };
872 let expected = Value::Record(vec![(
873 "a".to_owned(),
874 Value::Record(vec![
875 ("type".to_owned(), Value::String("Val1".to_owned())),
876 ("x".to_owned(), Value::Float(1.0)),
877 ("y".to_owned(), Value::Float(2.0)),
878 ]),
879 )]);
880
881 assert_eq!(
882 to_value(test)?,
883 expected,
884 "error serializing struct internal enum"
885 );
886
887 let test = TestStructAdjacentEnum {
888 a: StructAdjacentEnum::Val1 { x: 1.0, y: 2.0 },
889 };
890 let expected = Value::Record(vec![(
891 "a".to_owned(),
892 Value::Record(vec![
893 ("t".to_owned(), Value::String("Val1".to_owned())),
894 (
895 "v".to_owned(),
896 Value::Record(vec![
897 ("x".to_owned(), Value::Float(1.0)),
898 ("y".to_owned(), Value::Float(2.0)),
899 ]),
900 ),
901 ]),
902 )]);
903
904 assert_eq!(
905 to_value(test)?,
906 expected,
907 "error serializing struct adjacent enum"
908 );
909
910 let test = TestStructUntaggedEnum {
911 a: StructUntaggedEnum::Val1 { x: 1.0, y: 2.0 },
912 };
913 let expected = Value::Record(vec![(
914 "a".to_owned(),
915 Value::Record(vec![
916 ("x".to_owned(), Value::Float(1.0)),
917 ("y".to_owned(), Value::Float(2.0)),
918 ]),
919 )]);
920
921 assert_eq!(
922 to_value(test)?,
923 expected,
924 "error serializing struct untagged enum"
925 );
926
927 let test = TestStructUntaggedEnum {
928 a: StructUntaggedEnum::Val2 {
929 x: 1.0,
930 y: 2.0,
931 z: 3.0,
932 },
933 };
934 let expected = Value::Record(vec![(
935 "a".to_owned(),
936 Value::Record(vec![
937 ("x".to_owned(), Value::Float(1.0)),
938 ("y".to_owned(), Value::Float(2.0)),
939 ("z".to_owned(), Value::Float(3.0)),
940 ]),
941 )]);
942
943 assert_eq!(
944 to_value(test)?,
945 expected,
946 "error serializing struct untagged enum variant"
947 );
948
949 Ok(())
950 }
951
952 #[test]
953 fn test_to_value_tuple_enum() -> TestResult {
954 let test = TestTupleExternalEnum {
955 a: TupleExternalEnum::Val2(1.0, 2.0, 3.0),
956 };
957
958 let expected = Value::Record(vec![(
959 "a".to_owned(),
960 Value::Record(vec![
961 ("type".to_owned(), Value::Enum(1, "Val2".to_owned())),
962 (
963 "value".to_owned(),
964 Value::Array(vec![
965 Value::Union(1, Box::new(Value::Float(1.0))),
966 Value::Union(1, Box::new(Value::Float(2.0))),
967 Value::Union(1, Box::new(Value::Float(3.0))),
968 ]),
969 ),
970 ]),
971 )]);
972
973 assert_eq!(
974 to_value(test)?,
975 expected,
976 "error serializing tuple external enum"
977 );
978
979 let test = TestTupleAdjacentEnum {
980 a: TupleAdjacentEnum::Val1(1.0, 2.0),
981 };
982
983 let expected = Value::Record(vec![(
984 "a".to_owned(),
985 Value::Record(vec![
986 ("t".to_owned(), Value::String("Val1".to_owned())),
987 (
988 "v".to_owned(),
989 Value::Array(vec![Value::Float(1.0), Value::Float(2.0)]),
990 ),
991 ]),
992 )]);
993
994 assert_eq!(
995 to_value(test)?,
996 expected,
997 "error serializing tuple adjacent enum"
998 );
999
1000 let test = TestTupleUntaggedEnum {
1001 a: TupleUntaggedEnum::Val1(1.0, 2.0),
1002 };
1003
1004 let expected = Value::Record(vec![(
1005 "a".to_owned(),
1006 Value::Array(vec![Value::Float(1.0), Value::Float(2.0)]),
1007 )]);
1008
1009 assert_eq!(
1010 to_value(test)?,
1011 expected,
1012 "error serializing tuple untagged enum"
1013 );
1014
1015 Ok(())
1016 }
1017
1018 #[test]
1019 #[serial(avro_3747)]
1020 fn avro_3747_human_readable_false() {
1021 use serde::ser::Serializer as SerdeSerializer;
1022
1023 crate::util::SERDE_HUMAN_READABLE.store(false, Ordering::Release);
1024
1025 let ser = &mut Serializer {};
1026
1027 assert_eq!(ser.is_human_readable(), false);
1028 }
1029
1030 #[test]
1031 #[serial(avro_3747)]
1032 fn avro_3747_human_readable_true() {
1033 use serde::ser::Serializer as SerdeSerializer;
1034
1035 crate::util::SERDE_HUMAN_READABLE.store(true, Ordering::Release);
1036
1037 let ser = &mut Serializer {};
1038
1039 assert!(ser.is_human_readable());
1040 }
1041}