ambient_ecs/
component_ser.rs

1use std::fmt;
2
3use serde::{
4    de::{self, SeqAccess, Visitor},
5    ser::SerializeTuple,
6    Deserializer, Serializer,
7};
8
9use super::*;
10use crate::Serializable;
11
12impl Serialize for ComponentEntry {
13    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14        let mut map = serializer.serialize_tuple(2)?;
15        let ser = self.attribute::<Serializable>().expect("Component is not serializable");
16
17        map.serialize_element(&self.desc())?;
18        map.serialize_element(&ser.serialize(self))?;
19
20        map.end()
21    }
22}
23
24impl<'de> Deserialize<'de> for ComponentEntry {
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: Deserializer<'de>,
28    {
29        struct EntryVisitor;
30
31        impl<'de> Visitor<'de> for EntryVisitor {
32            type Value = ComponentEntry;
33
34            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
35                formatter.write_str("struct ComponentEntry")
36            }
37
38            fn visit_seq<V>(self, mut seq: V) -> Result<ComponentEntry, V::Error>
39            where
40                V: SeqAccess<'de>,
41            {
42                let desc: ComponentDesc = seq.next_element()?.ok_or_else(|| de::Error::invalid_length(0, &self))?;
43
44                let ser = *desc.attribute::<Serializable>().expect("Component is not serializable");
45
46                seq.next_element_seed(ser.deserializer(desc))?.ok_or_else(|| de::Error::invalid_length(0, &self))
47            }
48        }
49
50        deserializer.deserialize_tuple(2, EntryVisitor)
51    }
52}
53
54impl From<Vec<ComponentEntry>> for Entity {
55    fn from(entries: Vec<ComponentEntry>) -> Self {
56        let mut data = Entity::new();
57        for entry in entries.into_iter() {
58            data.set_entry(entry);
59        }
60        data
61    }
62}
63impl From<Entity> for Vec<ComponentEntry> {
64    fn from(ed: Entity) -> Self {
65        ed.iter().cloned().collect_vec()
66    }
67}
68
69#[cfg(test)]
70mod test {
71    use crate::{Serializable, *};
72
73    components!("test", {
74        @[Serializable]
75        ser_test: String,
76    });
77
78    fn init() {
79        init_components();
80    }
81
82    #[test]
83    pub fn test_serialize_component() {
84        init();
85        let source = ser_test().desc();
86        let ser = serde_json::to_string(&source).unwrap();
87        assert_eq!(&ser, "\"core::test::ser_test\"");
88        let deser: ComponentDesc = serde_json::from_str(&ser).unwrap();
89        assert_eq!(source.index(), deser.index());
90    }
91
92    #[test]
93    pub fn test() {
94        init();
95        let source = ComponentEntry::new(ser_test(), "hello".to_string());
96        let ser = serde_json::to_string(&source).unwrap();
97        assert_eq!(&ser, "[\"core::test::ser_test\",\"hello\"]");
98        let deser: ComponentEntry = serde_json::from_str(&ser).unwrap();
99        assert_eq!(source.downcast_ref::<String>(), deser.downcast_ref::<String>());
100    }
101
102    #[test]
103    pub fn test_json_value() {
104        init();
105        let source = ComponentEntry::new(ser_test(), "hello".to_string());
106        let value = source.desc().to_json(&source).unwrap();
107        let deser: ComponentEntry = source.desc().from_json(&value).unwrap();
108        assert_eq!(source.downcast_ref::<String>(), deser.downcast_ref::<String>());
109    }
110}