1use crate::{
2 core_compiler::value_compiler::compile_value_container,
3 runtime::execution::{ExecutionInput, ExecutionOptions, execute_dxb_sync},
4 serde::error::SerializationError,
5 values::{
6 core_value::CoreValue,
7 core_values::{list::List, map::Map},
8 value_container::ValueContainer,
9 },
10};
11use core::result::Result;
12use serde::ser::{
13 Serialize, SerializeMap, SerializeSeq, SerializeStruct,
14 SerializeStructVariant, SerializeTuple, SerializeTupleStruct,
15 SerializeTupleVariant, Serializer,
16};
17
18use crate::{prelude::*, runtime::RuntimeInternal};
19
20pub struct DatexSerializer {}
21
22impl Default for DatexSerializer {
23 fn default() -> Self {
24 Self::new()
25 }
26}
27
28impl DatexSerializer {
29 pub fn new() -> Self {
30 DatexSerializer {}
31 }
32}
33
34pub fn to_bytes<T>(value: &T) -> Result<Vec<u8>, SerializationError>
35where
36 T: Serialize,
37{
38 let value_container = to_value_container(value)?;
39 Ok(compile_value_container(&value_container))
40}
41pub fn to_value_container<T>(
42 value: &T,
43) -> Result<ValueContainer, SerializationError>
44where
45 T: Serialize,
46{
47 let mut serializer = DatexSerializer::new();
48 let container = value.serialize(&mut serializer)?;
49 Ok(container)
50}
51
52#[derive(Default)]
61pub struct StructSerializer {
62 fields: Vec<(String, ValueContainer)>,
63}
64impl StructSerializer {
65 pub fn new() -> Self {
66 Self::default()
67 }
68}
69impl SerializeStruct for StructSerializer {
70 type Ok = ValueContainer;
71 type Error = SerializationError;
72
73 fn serialize_field<T: ?Sized>(
74 &mut self,
75 key: &'static str,
76 value: &T,
77 ) -> Result<(), Self::Error>
78 where
79 T: serde::Serialize,
80 {
81 let vc = value.serialize(&mut DatexSerializer::new())?;
82 self.fields.push((key.to_string(), vc));
83 Ok(())
84 }
85
86 fn end(self) -> Result<Self::Ok, Self::Error> {
87 Ok(Map::StructuralWithStringKeys(self.fields).into())
88 }
89}
90
91#[derive(Default)]
97pub struct TupleSerializer {
98 elements: Vec<ValueContainer>,
99}
100impl TupleSerializer {
101 pub fn new() -> Self {
102 Self {
103 elements: Vec::new(),
104 }
105 }
106}
107impl SerializeTuple for TupleSerializer {
108 type Ok = ValueContainer;
109 type Error = SerializationError;
110
111 fn serialize_element<T: ?Sized>(
112 &mut self,
113 value: &T,
114 ) -> Result<(), Self::Error>
115 where
116 T: serde::Serialize,
117 {
118 let vc = value.serialize(&mut DatexSerializer::new())?;
119 self.elements.push(vc);
120 Ok(())
121 }
122
123 fn end(self) -> Result<Self::Ok, Self::Error> {
124 let mut list = List::default();
125 for element in self.elements.into_iter() {
126 list.push(element);
127 }
128 Ok(ValueContainer::from(CoreValue::List(list)))
129 }
130}
131
132pub struct TupleStructSerializer {
138 _name: &'static str,
139 fields: List,
140}
141impl TupleStructSerializer {
142 pub fn new(name: &'static str) -> Self {
143 Self {
144 _name: name,
145 fields: List::default(),
146 }
147 }
148}
149impl SerializeTupleStruct for TupleStructSerializer {
150 type Ok = ValueContainer;
151 type Error = SerializationError;
152
153 fn serialize_field<T: ?Sized>(
154 &mut self,
155 value: &T,
156 ) -> Result<(), Self::Error>
157 where
158 T: Serialize,
159 {
160 let field = value.serialize(&mut DatexSerializer::new())?;
161 self.fields.push(field);
162 Ok(())
163 }
164
165 fn end(self) -> Result<Self::Ok, Self::Error> {
166 Ok(ValueContainer::from(self.fields))
167 }
168}
169
170pub struct TupleVariantSerializer {
179 variant: &'static str,
180 fields: List,
181}
182impl TupleVariantSerializer {
183 pub fn new(variant: &'static str) -> Self {
184 Self {
185 variant,
186 fields: List::default(),
187 }
188 }
189}
190impl SerializeTupleVariant for TupleVariantSerializer {
191 type Ok = ValueContainer;
192 type Error = SerializationError;
193
194 fn serialize_field<T: ?Sized>(
195 &mut self,
196 value: &T,
197 ) -> Result<(), Self::Error>
198 where
199 T: Serialize,
200 {
201 let field = value.serialize(&mut DatexSerializer::new())?;
202 self.fields.push(field);
203 Ok(())
204 }
205
206 fn end(self) -> Result<Self::Ok, Self::Error> {
207 Ok(ValueContainer::from(CoreValue::Map(Map::from(vec![(
208 self.variant.to_string(),
209 self.fields.into(),
210 )]))))
211 }
212}
213
214pub struct StructVariantSerializer {
223 variant: &'static str,
224 fields: Vec<(String, ValueContainer)>,
225}
226impl StructVariantSerializer {
227 pub fn new(variant: &'static str) -> Self {
228 Self {
229 variant,
230 fields: Vec::new(),
231 }
232 }
233}
234impl SerializeStructVariant for StructVariantSerializer {
235 type Ok = ValueContainer;
236 type Error = SerializationError;
237
238 fn serialize_field<T: ?Sized>(
239 &mut self,
240 key: &'static str,
241 value: &T,
242 ) -> Result<(), Self::Error>
243 where
244 T: serde::Serialize,
245 {
246 let field = value.serialize(&mut DatexSerializer::new())?;
247 self.fields.push((key.to_string(), field));
248 Ok(())
249 }
250
251 fn end(self) -> Result<Self::Ok, Self::Error> {
252 Ok(Map::from(vec![(
253 self.variant.to_string(),
254 Map::from(self.fields).into(),
255 )])
256 .into())
257 }
258}
259
260#[derive(Default)]
266pub struct SeqSerializer {
267 elements: List,
268}
269impl SeqSerializer {
270 pub fn new() -> Self {
271 Self {
272 elements: List::default(),
273 }
274 }
275}
276impl SerializeSeq for SeqSerializer {
277 type Ok = ValueContainer;
278 type Error = SerializationError;
279
280 fn serialize_element<T: ?Sized>(
281 &mut self,
282 value: &T,
283 ) -> Result<(), Self::Error>
284 where
285 T: serde::Serialize,
286 {
287 let vc = value.serialize(&mut DatexSerializer::new())?;
288 self.elements.push(vc);
289 Ok(())
290 }
291
292 fn end(self) -> Result<Self::Ok, Self::Error> {
293 Ok(ValueContainer::from(self.elements))
294 }
295}
296
297#[derive(Default)]
303pub struct MapSerializer {
304 entries: Vec<(ValueContainer, Option<ValueContainer>)>,
305}
306impl MapSerializer {
307 pub fn new() -> Self {
308 Self {
309 entries: Vec::new(),
310 }
311 }
312}
313
314impl SerializeMap for MapSerializer {
315 type Ok = ValueContainer;
316 type Error = SerializationError;
317
318 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
319 where
320 T: serde::Serialize,
321 {
322 let key = key.serialize(&mut DatexSerializer::new())?;
323 self.entries.push((key, None));
324 Ok(())
325 }
326
327 fn serialize_value<T: ?Sized>(
328 &mut self,
329 value: &T,
330 ) -> Result<(), Self::Error>
331 where
332 T: serde::Serialize,
333 {
334 let vc = value.serialize(&mut DatexSerializer::new())?;
335 if let Some(last) = self.entries.last_mut() {
336 last.1 = Some(vc);
337 Ok(())
338 } else {
339 Err(SerializationError::Custom(
340 "serialize_value called before serialize_key".to_string(),
341 ))
342 }
343 }
344
345 fn end(self) -> Result<Self::Ok, Self::Error> {
346 let mut map = Map::default();
347 for (key, value) in self.entries.into_iter() {
348 if let Some(value) = value {
349 map.set(&key, value);
350 } else {
351 return Err(SerializationError::Custom(
352 "Map entry without value".to_string(),
353 ));
354 }
355 }
356 Ok(map.into())
357 }
358}
359
360impl Serializer for &mut DatexSerializer {
362 type Ok = ValueContainer;
363 type Error = SerializationError;
364
365 type SerializeStruct = StructSerializer;
366 type SerializeTuple = TupleSerializer;
367 type SerializeTupleStruct = TupleStructSerializer;
368 type SerializeTupleVariant = TupleVariantSerializer;
369 type SerializeStructVariant = StructVariantSerializer;
370 type SerializeSeq = SeqSerializer;
371 type SerializeMap = MapSerializer;
372
373 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
374 Ok(ValueContainer::from(v))
375 }
376
377 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
378 Ok(ValueContainer::from(v))
379 }
380
381 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
382 Ok(ValueContainer::from(v))
383 }
384
385 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
386 Ok(ValueContainer::from(v))
387 }
388
389 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
390 Ok(ValueContainer::from(v))
391 }
392
393 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
394 Ok(ValueContainer::from(v))
395 }
396
397 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
398 Ok(ValueContainer::from(v))
399 }
400
401 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
402 Ok(ValueContainer::from(v))
403 }
404
405 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
406 Ok(ValueContainer::from(v))
407 }
408
409 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
410 Ok(ValueContainer::from(v))
411 }
412
413 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
414 Ok(ValueContainer::from(v))
415 }
416
417 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
418 Ok(ValueContainer::from(v))
419 }
420
421 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
422 Ok(ValueContainer::from(v))
423 }
424
425 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
426 Ok(ValueContainer::from(v.to_string()))
427 }
428
429 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
430 Ok(ValueContainer::from(v))
431 }
432
433 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
434 core::todo!("#134 Undescribed by author.")
435 }
436
437 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
438 Ok(CoreValue::Null.into())
439 }
440
441 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
442 where
443 T: ?Sized + serde::Serialize,
444 {
445 value.serialize(&mut *self).map_err(|e| {
446 SerializationError::CanNotSerialize(format!(
447 "Failed to serialize Some value: {e}"
448 ))
449 })
450 }
451
452 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
453 Ok(Map::default().into())
454 }
455
456 fn serialize_struct(
457 self,
458 _name: &'static str,
459 _len: usize,
460 ) -> Result<Self::SerializeStruct, Self::Error> {
461 Ok(StructSerializer::new())
462 }
463
464 fn serialize_unit_struct(
465 self,
466 _name: &'static str,
467 ) -> Result<Self::Ok, Self::Error> {
468 Ok(Map::default().into())
469 }
470
471 fn serialize_unit_variant(
472 self,
473 _name: &'static str,
474 _variant_index: u32,
475 variant: &'static str,
476 ) -> Result<Self::Ok, Self::Error> {
477 Ok(ValueContainer::from(variant))
478 }
479
480 fn serialize_newtype_struct<T>(
481 self,
482 name: &'static str,
483 value: &T,
484 ) -> Result<Self::Ok, Self::Error>
485 where
486 T: ?Sized + serde::Serialize,
487 {
488 if name == "datex::endpoint" {
489 let endpoint = value
490 .serialize(&mut *self)?
491 .to_value()
492 .borrow()
493 .cast_to_endpoint()
494 .unwrap();
495 Ok(ValueContainer::from(endpoint))
496 } else if name == "datex::value" {
497 let runtime = RuntimeInternal::stub();
498 let bytes = unsafe { &*(value as *const T as *const Vec<u8>) };
500 Ok(execute_dxb_sync(ExecutionInput::new(
501 bytes,
502 ExecutionOptions::default(),
503 Rc::new(runtime),
504 ))
505 .unwrap()
506 .unwrap())
507 } else if name.starts_with("datex::") {
508 let mut struct_serializer = StructSerializer::new();
513 struct_serializer.serialize_field(name, value)?;
514 struct_serializer.end()
515 } else {
516 Ok(value.serialize(&mut *self)?)
517 }
518 }
519
520 fn serialize_newtype_variant<T>(
529 self,
530 _name: &'static str,
531 _variant_index: u32,
532 variant: &'static str,
533 value: &T,
534 ) -> Result<Self::Ok, Self::Error>
535 where
536 T: ?Sized + serde::Serialize,
537 {
538 let field = value.serialize(&mut *self)?;
539 Ok(ValueContainer::from(CoreValue::Map(Map::from(vec![(
540 variant.to_string(),
541 field,
542 )]))))
543 }
544
545 fn serialize_seq(
546 self,
547 _len: Option<usize>,
548 ) -> Result<Self::SerializeSeq, Self::Error> {
549 Ok(SeqSerializer::new())
550 }
551
552 fn serialize_tuple(
553 self,
554 _len: usize,
555 ) -> Result<Self::SerializeTuple, Self::Error> {
556 Ok(TupleSerializer::new())
557 }
558
559 fn serialize_tuple_struct(
560 self,
561 name: &'static str,
562 _len: usize,
563 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
564 Ok(TupleStructSerializer::new(name))
565 }
566
567 fn serialize_tuple_variant(
568 self,
569 _name: &'static str,
570 _variant_index: u32,
571 variant: &'static str,
572 _len: usize,
573 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
574 Ok(TupleVariantSerializer::new(variant))
575 }
576
577 fn serialize_map(
578 self,
579 _len: Option<usize>,
580 ) -> Result<Self::SerializeMap, Self::Error> {
581 Ok(MapSerializer::new())
582 }
583
584 fn serialize_struct_variant(
585 self,
586 _name: &'static str,
587 _variant_index: u32,
588 variant: &'static str,
589 _len: usize,
590 ) -> Result<Self::SerializeStructVariant, Self::Error> {
591 Ok(StructVariantSerializer::new(variant))
592 }
593
594 fn is_human_readable(&self) -> bool {
595 true
596 }
597}
598
599#[cfg(test)]
600mod tests {
601 use crate::{
602 assert_structural_eq,
603 serde::serializer::{DatexSerializer, to_bytes, to_value_container},
604 traits::structural_eq::StructuralEq,
605 values::core_values::{endpoint::Endpoint, map::Map},
606 };
607
608 use crate::{
609 prelude::*,
610 values::{
611 core_value::CoreValue, value::Value,
612 value_container::ValueContainer,
613 },
614 };
615 use core::assert_matches;
616 use serde::{Deserialize, Serialize};
617
618 #[derive(Serialize)]
619 struct TestStruct {
620 field1: String,
621 field2: i32,
622 }
623
624 #[derive(Serialize)]
625 struct TestTupleStruct(String, i32);
626
627 #[derive(Serialize)]
628 struct UnitStruct;
629
630 #[derive(Serialize)]
631 enum TestEnum {
632 Unit,
633 Tuple(i32, String),
634 Struct { x: bool, y: f64 },
635 }
636
637 #[derive(Serialize)]
638 struct NestedStruct {
639 nested: TestStruct,
640 value: i32,
641 }
642
643 #[derive(Serialize)]
644 struct StructWithOption {
645 value: Option<i32>,
646 }
647
648 #[derive(Serialize)]
649 struct StructWithVec {
650 values: Vec<i32>,
651 }
652
653 #[derive(Serialize)]
654 struct TestStructWithEndpoint {
655 endpoint: Endpoint,
656 }
657
658 #[derive(Serialize, Deserialize, Debug)]
659 pub struct StructWithUSize {
660 pub usize: Option<usize>,
661 }
662
663 #[test]
664 fn datex_serializer() {
665 let mut serializer = DatexSerializer::new();
666 let test_struct = TestStruct {
667 field1: "Hello".to_string(),
668 field2: 42,
669 };
670 let value_container = test_struct.serialize(&mut serializer).unwrap();
671 assert_matches!(
672 value_container,
673 ValueContainer::Local(Value {
674 inner: CoreValue::Map(_),
675 ..
676 })
677 );
678 }
679
680 #[test]
681 fn r#struct() {
682 let test_struct = TestStruct {
683 field1: "Hello".to_string(),
684 field2: 42,
685 };
686 let result = to_value_container(&test_struct).unwrap();
687 assert_eq!(result.to_string(), r#"{"field1": "Hello", "field2": 42}"#);
688 }
689
690 #[test]
691 fn tuple_struct() {
692 let ts = TestTupleStruct("hi".to_string(), 99);
693 let result = to_value_container(&ts).unwrap();
694 assert_eq!(result.to_string(), r#"["hi", 99]"#);
695 }
696
697 #[test]
698 fn unit_struct() {
699 let us = UnitStruct;
700 let result = to_value_container(&us).unwrap();
701 assert_eq!(result.to_string(), r#"{}"#);
702 }
703
704 #[test]
705 fn enum_unit_variant() {
706 let e = TestEnum::Unit;
707 let result = to_value_container(&e).unwrap();
708 assert_eq!(result.to_string(), r#""Unit""#);
709 }
710
711 #[test]
712 fn enum_tuple_variant() {
713 let e = TestEnum::Tuple(42, "hello".to_string());
714 let result = to_value_container(&e).unwrap();
715 assert_eq!(result.to_string(), r#"{"Tuple": [42, "hello"]}"#);
716 }
717
718 #[test]
719 fn enum_struct_variant() {
720 let e = TestEnum::Struct { x: true, y: 3.5 };
721 let result = to_value_container(&e).unwrap();
722 assert_eq!(result.to_string(), r#"{"Struct": {"x": true, "y": 3.5}}"#);
723 }
724
725 #[test]
726 fn vec() {
727 let data = vec![10, 20, 30];
728 let result = to_value_container(&data).unwrap();
729 assert_eq!(result.to_string(), "[10, 20, 30]");
730 }
731
732 #[test]
733 fn tuple_array() {
734 let data = [1, 2, 3, 4];
735 let result = to_value_container(&data).unwrap();
736 assert_eq!(result.to_string(), "[1, 2, 3, 4]");
737 }
738
739 #[test]
740 fn nested_struct() {
741 let nested = NestedStruct {
742 nested: TestStruct {
743 field1: "A".to_string(),
744 field2: 1,
745 },
746 value: 99,
747 };
748 let result = to_value_container(&nested).unwrap();
749 assert_eq!(
750 result.to_string(),
751 r#"{"nested": {"field1": "A", "field2": 1}, "value": 99}"#
752 );
753 }
754
755 #[test]
756 fn struct_with_option_some() {
757 let s = StructWithOption { value: Some(42) };
758 let result = to_value_container(&s).unwrap();
759 assert_eq!(result.to_string(), r#"{"value": 42}"#);
760 }
761
762 #[test]
763 fn struct_with_option_none() {
764 let s = StructWithOption { value: None };
765 let result = to_value_container(&s).unwrap();
766 assert_eq!(result.to_string(), r#"{"value": null}"#);
768 }
769
770 #[test]
771 fn struct_with_vec() {
772 let s = StructWithVec {
773 values: vec![1, 2, 3],
774 };
775 let result = to_value_container(&s).unwrap();
776 assert_eq!(result.to_string(), r#"{"values": [1, 2, 3]}"#);
777 }
778
779 #[test]
780 fn primitive_values() {
781 let i = 42;
783 let vc = to_value_container(&i).unwrap();
784 assert_eq!(vc.to_string(), "42");
785
786 let f = 3.4;
788 let vc = to_value_container(&f).unwrap();
789 assert_eq!(vc.to_string(), "3.4");
790
791 let b = true;
793 let vc = to_value_container(&b).unwrap();
794 assert_eq!(vc.to_string(), "true");
795
796 let s = "test";
798 let vc = to_value_container(&s).unwrap();
799 assert_eq!(vc.to_string(), r#""test""#);
800 }
801
802 #[test]
803 fn array_serialization() {
804 let arr = vec![1, 2, 3];
805 let vc = to_value_container(&arr).unwrap();
806 assert_eq!(vc.to_string(), "[1, 2, 3]");
807 }
808
809 #[test]
810 fn serializer_into_inner_map() {
811 let mut serializer = DatexSerializer::new();
812 let s = TestStruct {
813 field1: "Hello".to_string(),
814 field2: 42,
815 };
816 let value_container = s.serialize(&mut serializer).unwrap();
817 assert_matches!(
818 value_container,
819 ValueContainer::Local(Value {
820 inner: CoreValue::Map(_),
821 ..
822 })
823 );
824 }
825
826 #[test]
827 fn struct_to_bytes() {
828 let test_struct = TestStruct {
829 field1: "Hello".to_string(),
830 field2: 42,
831 };
832 let result = to_bytes(&test_struct);
833 assert!(result.is_ok());
834 assert!(!result.unwrap().is_empty());
835 }
836
837 #[test]
838 fn to_bytes_with_struct_with_usize() {
839 let test_struct = StructWithUSize { usize: Some(42) };
840 let result = to_value_container(&test_struct);
841 assert!(result.is_ok());
842 let result = result.unwrap();
843 assert_structural_eq!(
844 result
845 .to_value()
846 .borrow()
847 .cast_to_map()
848 .unwrap()
849 .get("usize")
850 .unwrap(),
851 ValueContainer::from(42)
852 );
853 }
854
855 #[test]
856 fn endpoint() {
857 let script = "@test";
858 let result = to_value_container(&script).unwrap();
859 assert_eq!(result.to_string(), "\"@test\"");
860
861 let test_struct = TestStructWithEndpoint {
862 endpoint: Endpoint::new("@test"),
863 };
864
865 let result = to_value_container(&test_struct);
866 assert!(result.is_ok());
867 let result = result.unwrap();
868 let map = Map::StructuralWithStringKeys(vec![(
869 "endpoint".to_string(),
870 ValueContainer::from(Endpoint::new("@test")),
871 )]);
872 assert_eq!(result, ValueContainer::from(map));
873 }
874
875 #[derive(Serialize)]
876 struct MyNewtype(i32);
877
878 #[test]
879 fn newtype_struct() {
880 let my_newtype = MyNewtype(100);
881 let result = to_value_container(&my_newtype).unwrap();
882 assert_eq!(result.to_string(), r#"100"#);
883 }
884
885 #[derive(Serialize)]
886 struct StructType(i32, String, bool);
887 #[test]
888 fn newtype_struct_multiple_fields() {
889 let s = StructType(1, "test".to_string(), true);
890 let result = to_value_container(&s).unwrap();
891 assert_eq!(result.to_string(), r#"[1, "test", true]"#);
892 }
893
894 #[derive(Serialize)]
895 enum MyTaggedEnum {
896 Variant1 { x: i32, y: String },
897 Variant2(i32, String),
898 Empty,
899 }
900
901 #[test]
902 fn tagged_enum() {
903 let e = MyTaggedEnum::Variant1 {
904 x: 42,
905 y: "test".to_string(),
906 };
907 let result = to_value_container(&e).unwrap();
908 assert_eq!(
909 result.to_string(),
910 r#"{"Variant1": {"x": 42, "y": "test"}}"#
911 );
912
913 let e = MyTaggedEnum::Variant2(100, "hello".to_string());
914 let result = to_value_container(&e).unwrap();
915 assert_eq!(result.to_string(), r#"{"Variant2": [100, "hello"]}"#);
916
917 let e = MyTaggedEnum::Empty;
918 let result = to_value_container(&e).unwrap();
919 assert_eq!(result.to_string(), r#""Empty""#);
920 }
921}