Skip to main content

datex_core/dif/
mod.rs

1use crate::prelude::*;
2use serde::{Deserialize, Serialize};
3
4pub mod interface;
5pub mod reference;
6pub mod representation;
7pub mod r#type;
8pub mod update;
9pub mod value;
10
11pub trait DIFConvertible: Serialize + for<'de> Deserialize<'de> {
12    fn to_json(self) -> String {
13        self.as_json()
14    }
15    fn to_json_pretty(self) -> String {
16        self.as_json_pretty()
17    }
18    fn from_json(json: &str) -> Self {
19        serde_json::from_str(json).unwrap()
20    }
21    fn as_json(&self) -> String {
22        serde_json::to_string(self).unwrap()
23    }
24    fn as_json_pretty(&self) -> String {
25        serde_json::to_string_pretty(self).unwrap()
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use crate::{
32        dif::{
33            DIFConvertible,
34            representation::DIFValueRepresentation,
35            r#type::{DIFType, DIFTypeDefinition, DIFTypeMetadata},
36            update::DIFUpdateData,
37            value::{DIFValue, DIFValueContainer},
38        },
39        libs::core::CoreLibPointerId,
40        prelude::*,
41        shared_values::pointer_address::PointerAddress,
42        types::definition::TypeDefinition,
43        values::{
44            core_value::CoreValue,
45            core_values::{
46                integer::typed_integer::IntegerTypeVariant, r#type::Type,
47            },
48            value::Value,
49            value_container::ValueContainer,
50        },
51    };
52    use alloc::string::ToString;
53
54    fn dif_value_circle(value_container: ValueContainer) -> DIFValueContainer {
55        let dif_value_container: DIFValueContainer =
56            DIFValueContainer::from_value_container(&value_container);
57        let serialized = dif_value_container.as_json();
58        let deserialized: DIFValueContainer =
59            DIFValueContainer::from_json(&serialized);
60        assert_eq!(dif_value_container, deserialized);
61        dif_value_container
62    }
63
64    #[test]
65    fn serde() {
66        // replace
67        let dif_update =
68            DIFUpdateData::replace(DIFValueContainer::Value(DIFValue {
69                value: DIFValueRepresentation::String("Hello".to_string()),
70                ty: None,
71            }));
72        let serialized = dif_update.as_json();
73        let deserialized: DIFUpdateData = DIFUpdateData::from_json(&serialized);
74        assert_eq!(dif_update, deserialized);
75
76        // update property
77        let dif_update = DIFUpdateData::set(
78            "name",
79            DIFValueContainer::Value(DIFValue {
80                value: DIFValueRepresentation::Number(42.0),
81                ty: None,
82            }),
83        );
84        let serialized = dif_update.as_json();
85        let deserialized: DIFUpdateData = DIFUpdateData::from_json(&serialized);
86        assert_eq!(dif_update, deserialized);
87    }
88
89    #[test]
90    fn dif_value_serialization() {
91        let value = DIFValue {
92            value: DIFValueRepresentation::Null,
93            ty: Some(DIFTypeDefinition::Unit),
94        };
95        let serialized = value.as_json();
96        let deserialized = DIFValue::from_json(&serialized);
97        assert_eq!(value, deserialized);
98    }
99
100    #[test]
101    fn from_value_container_i32() {
102        let dif_value_container = dif_value_circle(ValueContainer::from(42i32));
103        if let DIFValueContainer::Value(dif_value) = &dif_value_container {
104            assert_eq!(dif_value.value, DIFValueRepresentation::Number(42f64));
105            assert_eq!(
106                dif_value.ty,
107                Some(DIFTypeDefinition::Reference(
108                    CoreLibPointerId::Integer(Some(IntegerTypeVariant::I32))
109                        .into()
110                ))
111            );
112        } else {
113            core::panic!("Expected DIFValueContainer::Value variant");
114        }
115    }
116
117    #[test]
118    fn from_value_container_text() {
119        let dif_value_container =
120            dif_value_circle(ValueContainer::from("Hello, World!"));
121        if let DIFValueContainer::Value(dif_value) = &dif_value_container {
122            assert_eq!(
123                dif_value.value,
124                DIFValueRepresentation::String("Hello, World!".to_string())
125            );
126            assert_eq!(dif_value.ty, None);
127        } else {
128            core::panic!("Expected DIFValueContainer::Value variant");
129        }
130    }
131
132    #[test]
133    fn dif_value_no_type() {
134        let val = ValueContainer::Local(Value::null());
135        let dif_val = DIFValueContainer::from_value_container(&val);
136        assert_eq!(
137            dif_val,
138            DIFValueContainer::Value(DIFValue::new(
139                DIFValueRepresentation::Null,
140                Option::<DIFTypeDefinition>::None,
141            ),)
142        );
143    }
144
145    #[test]
146    fn dif_value_with_type() {
147        let val = ValueContainer::Local(Value {
148            inner: CoreValue::Null,
149            actual_type: Box::new(TypeDefinition::ImplType(
150                Box::new(Type::integer()),
151                vec![PointerAddress::owned([0, 0, 0, 0, 0])],
152            )),
153        });
154
155        let dif_val = DIFValueContainer::from_value_container(&val);
156        assert_eq!(
157            dif_val,
158            DIFValueContainer::Value(DIFValue {
159                value: DIFValueRepresentation::Null,
160                ty: Some(DIFTypeDefinition::ImplType(
161                    Box::new(DIFType {
162                        name: None,
163                        metadata: DIFTypeMetadata::default(),
164                        type_definition: DIFTypeDefinition::Reference(
165                            PointerAddress::from(CoreLibPointerId::Integer(
166                                None
167                            ))
168                        )
169                    }),
170                    vec![PointerAddress::owned([0, 0, 0, 0, 0])]
171                ))
172            })
173        );
174    }
175}