Skip to main content

datex_core/serde/
serializer.rs

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/// Serializer for structs
53/// For example:
54/// struct MyStruct {
55///     field1: String,
56///     field2: i32,
57/// }
58/// will be serialized as:
59/// {"field1": String, "field2": i32}
60#[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/// Serializer for tuples
92/// For example:
93/// (i32, String)
94/// will be serialized as:
95/// [i32, String]
96#[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
132/// Serializer for tuple structs
133/// For example:
134/// struct MyStruct(i32, String);
135/// will be serialized as:
136/// [i32, String]
137pub 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
170/// Serializer for enum variants with tuple fields
171/// For example:
172/// enum MyEnum {
173///     Variant1(i32, String),
174///     Variant2(bool),
175/// }
176/// will be serialized as:
177/// {"Variant1": [i32, String]}
178pub 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
214/// Serializer for enum variants with struct fields
215/// For example:
216/// enum MyEnum {
217///     Variant1 { x: i32, y: String },
218///     Variant2 { a: bool },
219/// }
220/// will be serialized as:
221/// {"Variant1": {"x": i32, "y": String}}
222pub 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/// Serializer for sequences
261/// For example:
262/// vec![1, 2, 3]
263/// will be serialized as:
264/// [1, 2, 3]
265#[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/// Serializer for maps
298/// For example:
299///     HashMap<String, i32>
300/// will be serialized as:
301///     {"key": 1, "key2": 2, "key3": 3}
302#[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
360/// Main serializer implementation
361impl 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            // unsafe cast value to ValueContainer
499            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            // Serialize internal new type structs as normal structs
509            // {"datex::field": value}
510            // instead of
511            // value
512            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    /// Serialize newtype enum variants as structs with one field
521    /// For example:
522    /// enum MyEnum {
523    ///     Variant1(String),
524    ///     Variant2(i32, String),
525    /// }
526    /// is serialized as
527    /// {"Variant2": [100, "hello"]}
528    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        // None can serialize as null
767        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        // integer
782        let i = 42;
783        let vc = to_value_container(&i).unwrap();
784        assert_eq!(vc.to_string(), "42");
785
786        // float
787        let f = 3.4;
788        let vc = to_value_container(&f).unwrap();
789        assert_eq!(vc.to_string(), "3.4");
790
791        // boolean
792        let b = true;
793        let vc = to_value_container(&b).unwrap();
794        assert_eq!(vc.to_string(), "true");
795
796        // string
797        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}