platform_value/value_serialization/
mod.rs1use crate::value_serialization::ser::Serializer;
2use crate::{Error, Value};
3use serde::Deserialize;
4use serde::Serialize;
5
6pub mod de;
7pub mod ser;
8
9pub fn to_value<T>(value: T) -> Result<Value, Error>
62where
63 T: Serialize,
64{
65 value.serialize(Serializer)
66}
67
68pub fn from_value<'de, T>(value: Value) -> Result<T, Error>
102where
103 T: Deserialize<'de>,
104{
105 T::deserialize(de::Deserializer(value))
106}
107
108#[cfg(test)]
109mod tests {
110 use serde::{Deserialize, Serialize};
111 use std::collections::HashMap;
112
113 use super::*;
114
115 #[test]
116 fn yeet() {
117 #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
118 struct Yeet {
119 arr: Vec<String>,
120 map: HashMap<String, char>,
121 number: i32,
122 }
125
126 let mut hm = HashMap::new();
127 hm.insert("wow".to_owned(), 'a');
128 hm.insert("lol".to_owned(), 'd');
129
130 let yeet = Yeet {
131 arr: vec!["kek".to_owned(), "top".to_owned()],
132 map: hm,
133 number: 420,
134 };
136
137 let platform_value = to_value(yeet.clone()).expect("please");
138 let yeet_back: Yeet = from_value(platform_value).expect("please once again");
139
140 assert_eq!(yeet, yeet_back);
141 }
142
143 #[test]
144 fn test_externally_tagged_unit_variant() {
145 #[derive(Serialize, Deserialize, Debug, PartialEq)]
146 #[serde(rename_all = "camelCase")]
147 enum Choice {
148 Abstain,
149 Lock,
150 TowardsIdentity(String),
151 }
152
153 let v = to_value(&Choice::Abstain).unwrap();
154 assert_eq!(v, Value::Text("abstain".to_string()));
155 let back: Choice = from_value(v).unwrap();
156 assert_eq!(back, Choice::Abstain);
157
158 let v = to_value(&Choice::Lock).unwrap();
159 assert_eq!(v, Value::Text("lock".to_string()));
160 let back: Choice = from_value(v).unwrap();
161 assert_eq!(back, Choice::Lock);
162 }
163
164 #[test]
165 fn test_externally_tagged_newtype_variant() {
166 #[derive(Serialize, Deserialize, Debug, PartialEq)]
167 #[serde(rename_all = "camelCase")]
168 enum Choice {
169 Abstain,
170 Lock,
171 TowardsIdentity(String),
172 }
173
174 let v = to_value(&Choice::TowardsIdentity("abc".into())).unwrap();
175 let back: Choice = from_value(v).unwrap();
176 assert_eq!(back, Choice::TowardsIdentity("abc".into()));
177 }
178
179 #[test]
180 fn test_internally_tagged_enum() {
181 #[derive(Serialize, Deserialize, Debug, PartialEq)]
182 #[serde(tag = "$formatVersion")]
183 enum Info {
184 #[serde(rename = "0")]
185 V0 { name: String },
186 }
187
188 let v = to_value(&Info::V0 {
189 name: "test".into(),
190 })
191 .unwrap();
192 let back: Info = from_value(v).unwrap();
193 assert_eq!(
194 back,
195 Info::V0 {
196 name: "test".into()
197 }
198 );
199 }
200
201 #[test]
202 fn test_externally_tagged_struct_variant() {
203 #[derive(Serialize, Deserialize, Debug, PartialEq)]
204 enum Shape {
205 Circle { radius: f64 },
206 Rectangle { width: f64, height: f64 },
207 }
208
209 let v = to_value(&Shape::Circle { radius: 5.0 }).unwrap();
210 let back: Shape = from_value(v).unwrap();
211 assert_eq!(back, Shape::Circle { radius: 5.0 });
212
213 let v = to_value(&Shape::Rectangle {
214 width: 3.0,
215 height: 4.0,
216 })
217 .unwrap();
218 let back: Shape = from_value(v).unwrap();
219 assert_eq!(
220 back,
221 Shape::Rectangle {
222 width: 3.0,
223 height: 4.0
224 }
225 );
226 }
227
228 #[test]
229 fn test_externally_tagged_tuple_variant() {
230 #[derive(Serialize, Deserialize, Debug, PartialEq)]
231 enum Point {
232 TwoD(f64, f64),
233 ThreeD(f64, f64, f64),
234 }
235
236 let v = to_value(&Point::TwoD(1.0, 2.0)).unwrap();
237 let back: Point = from_value(v).unwrap();
238 assert_eq!(back, Point::TwoD(1.0, 2.0));
239
240 let v = to_value(&Point::ThreeD(1.0, 2.0, 3.0)).unwrap();
241 let back: Point = from_value(v).unwrap();
242 assert_eq!(back, Point::ThreeD(1.0, 2.0, 3.0));
243 }
244
245 #[test]
246 fn test_externally_tagged_newtype_wrapping_struct() {
247 #[derive(Serialize, Deserialize, Debug, PartialEq)]
248 #[serde(rename_all = "camelCase")]
249 enum Vote {
250 ResourceVote(InnerVote),
251 }
252
253 #[derive(Serialize, Deserialize, Debug, PartialEq)]
254 #[serde(rename_all = "camelCase")]
255 struct InnerVote {
256 poll_name: String,
257 choice: u32,
258 }
259
260 let v = to_value(&Vote::ResourceVote(InnerVote {
261 poll_name: "test".into(),
262 choice: 42,
263 }))
264 .unwrap();
265 let back: Vote = from_value(v).unwrap();
266 assert_eq!(
267 back,
268 Vote::ResourceVote(InnerVote {
269 poll_name: "test".into(),
270 choice: 42,
271 })
272 );
273 }
274}