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 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 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}