1#![allow(clippy::upper_case_acronyms)]
4
5use std::{fmt, mem};
6
7use glib::{prelude::*, Date};
8use num_rational::Rational32;
9use once_cell::sync::Lazy;
10use serde::{
11 de,
12 de::{Deserialize, Deserializer, SeqAccess, Visitor},
13 ser,
14 ser::{Serialize, SerializeTuple, Serializer},
15};
16
17use crate::{date_time_serde, value::*, Buffer, DateTime, List, Sample, Structure};
18
19pub(crate) static ARRAY_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Array::static_type);
20pub(crate) static BITMASK_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Bitmask::static_type);
21pub(crate) static DATE_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Date::static_type);
22pub(crate) static DATE_TIME_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(DateTime::static_type);
23pub(crate) static FRACTION_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Fraction::static_type);
24pub(crate) static FRACTION_RANGE_OTHER_TYPE_ID: Lazy<glib::Type> =
25 Lazy::new(FractionRange::static_type);
26pub(crate) static INT_RANGE_I32_OTHER_TYPE_ID: Lazy<glib::Type> =
27 Lazy::new(IntRange::<i32>::static_type);
28pub(crate) static INT_RANGE_I64_OTHER_TYPE_ID: Lazy<glib::Type> =
29 Lazy::new(IntRange::<i64>::static_type);
30pub(crate) static LIST_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(List::static_type);
31pub(crate) static SAMPLE_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Sample::static_type);
32pub(crate) static BUFFER_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Buffer::static_type);
33pub(crate) static STRUCTURE_OTHER_TYPE_ID: Lazy<glib::Type> = Lazy::new(Structure::static_type);
34
35impl Serialize for Fraction {
36 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
37 self.0.serialize(serializer)
38 }
39}
40
41impl<'de> Deserialize<'de> for Fraction {
42 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
43 skip_assert_initialized!();
44 Rational32::deserialize(deserializer)
45 .map(|rational| Fraction::new(*rational.numer(), *rational.denom()))
46 }
47}
48
49macro_rules! ser_some_value (
50 ($value:expr, $t:ty, $ser_closure:expr) => {
51 {
52 let value = $value.get::<$t>().expect("ser_some_value macro");
53 $ser_closure(stringify!($t), value)
54 }
55 }
56);
57macro_rules! ser_opt_value (
58 ($value:expr, $t:ty, $ser_closure:expr) => {
59 {
60 let value = $value.get::<Option<$t>>().expect("ser_opt_value macro");
61 $ser_closure(stringify!($t), value)
62 }
63 }
64);
65macro_rules! ser_value (
66 ($value:expr, $ser_closure:expr) => {
67 #[allow(clippy::redundant_closure_call)]
68 match $value.type_() {
69 glib::Type::I8 => ser_some_value!($value, i8, $ser_closure),
70 glib::Type::U8 => ser_some_value!($value, u8, $ser_closure),
71 glib::Type::BOOL => ser_some_value!($value, bool, $ser_closure),
72 glib::Type::I32 => ser_some_value!($value, i32, $ser_closure),
73 glib::Type::U32 => ser_some_value!($value, u32, $ser_closure),
74 glib::Type::I64 => ser_some_value!($value, i64, $ser_closure),
75 glib::Type::U64 => ser_some_value!($value, u64, $ser_closure),
76 glib::Type::F32 => ser_some_value!($value, f32, $ser_closure),
77 glib::Type::F64 => ser_some_value!($value, f64, $ser_closure),
78 glib::Type::STRING => ser_opt_value!($value, String, $ser_closure),
79 type_id => {
80 if *ARRAY_OTHER_TYPE_ID == type_id {
81 ser_some_value!($value, Array, $ser_closure)
82 } else if *BITMASK_OTHER_TYPE_ID == type_id {
83 ser_some_value!($value, Bitmask, $ser_closure)
84 } else if *STRUCTURE_OTHER_TYPE_ID == type_id {
85 ser_some_value!($value, Structure, $ser_closure)
86 } else if *DATE_OTHER_TYPE_ID == type_id {
87 ser_opt_value!($value, Date, |type_, value: Option<Date>| {
88 $ser_closure(type_, value.map(date_time_serde::Date::from))
91 })
92 } else if *DATE_TIME_OTHER_TYPE_ID == type_id {
93 ser_opt_value!($value, DateTime, $ser_closure)
94 } else if *FRACTION_OTHER_TYPE_ID == type_id {
95 ser_some_value!($value, Fraction, $ser_closure)
96 } else if *FRACTION_RANGE_OTHER_TYPE_ID == type_id {
97 ser_some_value!($value, FractionRange, $ser_closure)
98 } else if *INT_RANGE_I32_OTHER_TYPE_ID == type_id {
99 ser_some_value!($value, IntRange<i32>, $ser_closure)
100 } else if *INT_RANGE_I64_OTHER_TYPE_ID == type_id {
101 ser_some_value!($value, IntRange<i64>, $ser_closure)
102 } else if *LIST_OTHER_TYPE_ID == type_id {
103 ser_some_value!($value, crate::List, $ser_closure)
104 } else if *SAMPLE_OTHER_TYPE_ID == type_id {
105 ser_opt_value!($value, Sample, $ser_closure)
106 } else if *BUFFER_OTHER_TYPE_ID == type_id {
107 ser_opt_value!($value, Buffer, $ser_closure)
108 } else {
109 Err(
110 ser::Error::custom(
111 format!("unimplemented `Value` serialization for type {}",
112 type_id,
113 )
114 )
115 )
116 }
117 }
118 }
119 }
120);
121
122#[repr(transparent)]
123pub(crate) struct SendValue(glib::SendValue);
124impl SendValue {
125 pub(crate) fn from(send_value: glib::SendValue) -> Self {
126 skip_assert_initialized!();
127 SendValue(send_value)
128 }
129}
130
131impl From<SendValue> for glib::SendValue {
132 fn from(send_value: SendValue) -> Self {
133 skip_assert_initialized!();
134 send_value.0
135 }
136}
137
138impl Serialize for SendValue {
139 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
140 ser_value!(self.0, |type_, value| {
141 let mut tup = serializer.serialize_tuple(2)?;
142 tup.serialize_element(type_)?;
143 tup.serialize_element(&value)?;
144 tup.end()
145 })
146 }
147}
148
149macro_rules! impl_ser_send_value_collection (
150 ($t:ident) => (
151 impl Serialize for $t {
152 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
153 let send_value_vec = unsafe {
154 &*(self.as_slice() as *const [glib::SendValue] as *const [SendValue])
155 };
156 send_value_vec.serialize(serializer)
157 }
158 }
159 );
160);
161
162impl_ser_send_value_collection!(Array);
163impl_ser_send_value_collection!(List);
164
165macro_rules! de_some_send_value(
166 ($type_name:expr, $seq:expr, $t:ty) => (
167 de_some_send_value!("Value", $type_name, $seq, $t)
168 );
169 ($outer_type:expr, $type_name:expr, $seq:expr, $t:ty) => (
170 de_send_value!($outer_type, $type_name, $seq, $t, $t)
171 );
172);
173macro_rules! de_opt_send_value(
174 ($type_name:expr, $seq:expr, $t:ty) => (
175 de_opt_send_value!("Value", $type_name, $seq, $t)
176 );
177 ($outer_type:expr, $type_name:expr, $seq:expr, $t:ty) => (
178 de_send_value!($outer_type, $type_name, $seq, Option<$t>, $t)
179 );
180);
181macro_rules! de_send_value(
182 ($outer_type:expr, $type_name:expr, $seq:expr, $elem_t:ty, $t:ty) => (
183 Ok(match $seq.next_element::<$elem_t>()? {
184 Some(base_value) => {
185 Some(SendValue::from(base_value
186 .to_value()
187 .try_into_send_value::<$t>()
188 .map_err(|_|
189 de::Error::custom(format!(
190 "Failed to convert `{}` with type {:?} to `SendValue`",
191 $outer_type,
192 $type_name,
193 ))
194 )?
195 ))
196 }
197 None => None
198 })
199 );
200 ($type_name:expr, $seq:expr) => (
201 match $type_name.as_str() {
202 "i8" => de_some_send_value!($type_name, $seq, i8),
203 "u8" => de_some_send_value!($type_name, $seq, u8),
204 "bool" => de_some_send_value!($type_name, $seq, bool),
205 "i32" => de_some_send_value!($type_name, $seq, i32),
206 "u32" => de_some_send_value!($type_name, $seq, u32),
207 "i64" => de_some_send_value!($type_name, $seq, i64),
208 "u64" => de_some_send_value!($type_name, $seq, u64),
209 "f32" => de_some_send_value!($type_name, $seq, f32),
210 "f64" => de_some_send_value!($type_name, $seq, f64),
211 "String" => de_opt_send_value!($type_name, $seq, String),
212 "Array" => de_some_send_value!($type_name, $seq, Array),
213 "Bitmask" => de_some_send_value!($type_name, $seq, Bitmask),
214 "Structure" => de_some_send_value!($type_name, $seq, Structure),
215 "Date" => {
216 de_send_value!(
219 "Value",
220 $type_name,
221 $seq,
222 Option<date_time_serde::Date>,
223 Date
224 )
225 }
226 "DateTime" => de_opt_send_value!($type_name, $seq, DateTime),
227 "Fraction" => de_some_send_value!($type_name, $seq, Fraction),
228 "FractionRange" => de_some_send_value!($type_name, $seq, FractionRange),
229 "IntRange<i32>" => de_some_send_value!($type_name, $seq, IntRange<i32>),
230 "IntRange<i64>" => de_some_send_value!($type_name, $seq, IntRange<i64>),
231 "Sample" => de_opt_send_value!($type_name, $seq, Sample),
232 "Buffer" => de_opt_send_value!($type_name, $seq, Buffer),
233 _ => return Err(
234 de::Error::custom(
235 format!(
236 "unimplemented deserialization for `Value` with type `{}`",
237 $type_name,
238 ),
239 )
240 ),
241 }
242 );
243);
244
245struct SendValueVisitor;
246impl<'de> Visitor<'de> for SendValueVisitor {
247 type Value = SendValue;
248
249 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
250 formatter.write_str("a tuple: (name, value)")
251 }
252
253 fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
254 let type_name = seq
255 .next_element::<String>()?
256 .ok_or_else(|| de::Error::custom("Expected a value for `Value` type"))?;
257 let send_value = de_send_value!(type_name, seq)?
258 .ok_or_else(|| de::Error::custom("Expected a value for `Value`"))?;
259 Ok(send_value)
260 }
261}
262
263impl<'de> Deserialize<'de> for SendValue {
264 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
265 skip_assert_initialized!();
266 deserializer.deserialize_tuple(2, SendValueVisitor {})
267 }
268}
269
270macro_rules! impl_de_send_value_collection (
271 ($t:ident) => {
272 impl<'de> Deserialize<'de> for $t {
273 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
274 skip_assert_initialized!();
275 let send_value_vec = Vec::<SendValue>::deserialize(deserializer)?;
276 Ok($t::from_values(unsafe{
277 mem::transmute::<Vec<SendValue>, Vec<glib::SendValue>>(send_value_vec)
278 }))
279 }
280 }
281 }
282);
283
284impl_de_send_value_collection!(Array);
285impl_de_send_value_collection!(List);
286
287#[cfg(test)]
288mod tests {
289 use glib::{Date, DateMonth};
290
291 use crate::{Array, Bitmask, DateTime, Fraction, FractionRange, IntRange, List, Structure};
292
293 #[test]
294 fn test_serialize_simple() {
295 crate::init().unwrap();
296
297 let pretty_config = ron::ser::PrettyConfig::new().new_line("".to_string());
298
299 let fraction = Fraction::new(1, 3);
301
302 let res = ron::ser::to_string_pretty(&fraction, pretty_config.clone());
303 assert_eq!(Ok("(1, 3)".to_owned()), res);
304
305 let res = serde_json::to_string(&fraction).unwrap();
306 assert_eq!("[1,3]".to_owned(), res);
307
308 let fraction_range = FractionRange::new(Fraction::new(1, 3), Fraction::new(1, 2));
310
311 let res = ron::ser::to_string_pretty(&fraction_range, pretty_config.clone());
312 assert_eq!(Ok("( min: (1, 3), max: (1, 2),)".to_owned()), res);
313
314 let res = serde_json::to_string(&fraction_range).unwrap();
315 assert_eq!(r#"{"min":[1,3],"max":[1,2]}"#.to_owned(), res);
316
317 let int_range = IntRange::with_step(0, 42, 21);
319 let res = ron::ser::to_string_pretty(&int_range, pretty_config.clone());
320 assert_eq!(Ok("( min: 0, max: 42, step: 21,)".to_owned()), res,);
321
322 let res = serde_json::to_string(&int_range).unwrap();
323 assert_eq!(r#"{"min":0,"max":42,"step":21}"#.to_owned(), res);
324
325 let bitmask = Bitmask::new(1024 + 128 + 32);
327
328 let res = ron::ser::to_string_pretty(&bitmask, pretty_config.clone());
329 assert_eq!(Ok("(1184)".to_owned()), res);
330
331 let res = serde_json::to_string(&bitmask).unwrap();
332 assert_eq!("1184".to_owned(), res);
333
334 let s = Structure::builder("foobar")
336 .field("foo", 42)
337 .field("baz", Structure::builder("baz").field("foo", 43).build())
338 .build();
339
340 let res = ron::ser::to_string_pretty(&s, pretty_config);
341 assert_eq!(
342 Ok(r#"("foobar", [ ("foo", "i32", 42), ("baz", "Structure", ("baz", [ ("foo", "i32", 43), ])),])"#.to_owned()),
343 res
344 );
345
346 let res = serde_json::to_string(&s).unwrap();
347 assert_eq!(
348 r#"["foobar",[["foo","i32",42],["baz","Structure",["baz",[["foo","i32",43]]]]]]"#
349 .to_owned(),
350 res
351 );
352 }
353
354 #[test]
355 fn test_serialize_collections() {
356 crate::init().unwrap();
357
358 let pretty_config = ron::ser::PrettyConfig::new().new_line("".to_string());
359
360 let value_13 = Fraction::new(1, 3);
362 let value_12 = Fraction::new(1, 2);
363
364 let array = Array::new([value_13, value_12]);
365
366 let res = ron::ser::to_string_pretty(&array, pretty_config.clone());
367 assert_eq!(
368 Ok(concat!(
369 r#"["#,
370 r#" ("Fraction", (1, 3)),"#,
371 r#" ("Fraction", (1, 2)),"#,
372 r#"]"#
373 )
374 .to_owned()),
375 res,
376 );
377
378 let res = serde_json::to_string(&array).unwrap();
379 assert_eq!(r#"[["Fraction",[1,3]],["Fraction",[1,2]]]"#.to_owned(), res);
380
381 let value_12 = Fraction::new(1, 2);
383
384 let list = List::new([value_12]);
385
386 let res = ron::ser::to_string_pretty(&list, pretty_config);
387 assert_eq!(
388 Ok(concat!(r#"["#, r#" ("Fraction", (1, 2)),"#, r#"]"#).to_owned()),
389 res,
390 );
391 }
392
393 #[test]
394 fn test_deserialize_simple() {
395 crate::init().unwrap();
396
397 let fraction_ron = "(1, 3)";
399 let fraction: Fraction = ron::de::from_str(fraction_ron).unwrap();
400 assert_eq!(fraction.0.numer(), &1);
401 assert_eq!(fraction.0.denom(), &3);
402
403 let fraction_json = "[1,3]";
404 let fraction: Fraction = serde_json::from_str(fraction_json).unwrap();
405 assert_eq!(fraction.0.numer(), &1);
406 assert_eq!(fraction.0.denom(), &3);
407
408 let fraction_range_ron = "(min: (1, 3), max: (1, 2))";
410 let fraction_range: FractionRange = ron::de::from_str(fraction_range_ron).unwrap();
411 assert_eq!(fraction_range.min().0.denom(), &3);
412 assert_eq!(fraction_range.max().0.denom(), &2);
413
414 let fraction_range_json = r#"{"min":[1,3],"max":[1,2]}"#;
415 let fraction_range: FractionRange = serde_json::from_str(fraction_range_json).unwrap();
416 assert_eq!(fraction_range.min().0.denom(), &3);
417 assert_eq!(fraction_range.max().0.denom(), &2);
418
419 let int_range_ron = "(min: 0, max: 42, step: 21)";
421 let int_range: IntRange<i32> = ron::de::from_str(int_range_ron).unwrap();
422 assert_eq!(int_range.min(), 0);
423 assert_eq!(int_range.max(), 42);
424 assert_eq!(int_range.step(), 21);
425
426 let int_range_json = r#"{"min":0,"max":42,"step":21}"#;
427 let int_range: IntRange<i32> = serde_json::from_str(int_range_json).unwrap();
428 assert_eq!(int_range.min(), 0);
429 assert_eq!(int_range.max(), 42);
430 assert_eq!(int_range.step(), 21);
431
432 let bitmask_ref = Bitmask::new(1024 + 128 + 32);
434
435 let bitmask_ron = "(1184)";
436 let bitmask: Bitmask = ron::de::from_str(bitmask_ron).unwrap();
437 assert_eq!(bitmask_ref, bitmask);
438
439 let bitmask_json = "1184";
440 let bitmask: Bitmask = serde_json::from_str(bitmask_json).unwrap();
441 assert_eq!(bitmask_ref, bitmask);
442
443 let s_ref = Structure::builder("foobar")
445 .field("foo", 42)
446 .field("baz", Structure::builder("baz").field("foo", 43).build())
447 .build();
448
449 let s_ron = r#"("foobar", [ ("foo", "i32", 42), ("baz", "Structure", ("baz", [ ("foo", "i32", 43), ])),])"#;
450 let s: Structure = ron::de::from_str(s_ron).unwrap();
451 assert_eq!(s_ref, s);
452
453 let s_json =
454 r#"["foobar",[["foo","i32",42],["baz","Structure",["baz",[["foo","i32",43]]]]]]"#;
455 let s: Structure = serde_json::from_str(s_json).unwrap();
456 assert_eq!(s_ref, s);
457 }
458
459 #[test]
460 fn test_serde_roundtrip_simple() {
461 crate::init().unwrap();
462
463 let fraction = Fraction::new(1, 3);
465 let fraction_ser = ron::ser::to_string(&fraction).unwrap();
466 let fraction_de: Fraction = ron::de::from_str(fraction_ser.as_str()).unwrap();
467 assert_eq!(fraction_de.0.numer(), fraction.0.numer());
468 assert_eq!(fraction_de.0.denom(), fraction.0.denom());
469
470 let fraction_range = FractionRange::new(Fraction::new(1, 3), Fraction::new(1, 2));
472 let fraction_range_ser = ron::ser::to_string(&fraction_range).unwrap();
473 let fraction_range_de: FractionRange =
474 ron::de::from_str(fraction_range_ser.as_str()).unwrap();
475 assert_eq!(
476 fraction_range_de.min().0.denom(),
477 fraction_range.min().0.denom()
478 );
479 assert_eq!(
480 fraction_range_de.max().0.denom(),
481 fraction_range.max().0.denom()
482 );
483
484 let int_range = IntRange::with_step(0, 42, 21);
486 let int_range_ser = ron::ser::to_string(&int_range).unwrap();
487 let int_range_de: IntRange<i32> = ron::de::from_str(int_range_ser.as_str()).unwrap();
488 assert_eq!(int_range_de.min(), int_range.min());
489 assert_eq!(int_range_de.max(), int_range.max());
490 assert_eq!(int_range_de.step(), int_range.step());
491
492 let bitmask = Bitmask::new(1024 + 128 + 32);
494 let bitmask_ser = ron::ser::to_string(&bitmask).unwrap();
495 let bitmask_de: Bitmask = ron::de::from_str(bitmask_ser.as_str()).unwrap();
496 assert_eq!(bitmask_de, bitmask);
497
498 let s = Structure::builder("foobar")
500 .field("foo", 42)
501 .field("baz", Structure::builder("baz").field("foo", 43).build())
502 .build();
503 let s_ser = ron::ser::to_string(&s).unwrap();
504 let s_de: Structure = ron::de::from_str(s_ser.as_str()).unwrap();
505 assert_eq!(s_de, s);
506 }
507
508 #[allow(clippy::cognitive_complexity)]
509 #[test]
510 fn test_deserialize_collections() {
511 crate::init().unwrap();
512
513 let array_ron = r#"[
515 ("Fraction", (1, 3)),
516 ("Fraction", (1, 2)),
517 ]"#;
518 let array: Array = ron::de::from_str(array_ron).unwrap();
519 let slice = array.as_slice();
520 assert_eq!(2, slice.len());
521
522 let fraction = slice[0].get::<Fraction>().expect("slice[0]");
523 assert_eq!(fraction.0.numer(), &1);
524 assert_eq!(fraction.0.denom(), &3);
525
526 let fraction = slice[1].get::<Fraction>().expect("slice[1]");
527 assert_eq!(fraction.0.numer(), &1);
528 assert_eq!(fraction.0.denom(), &2);
529
530 let array_ron = r#"[
532 ("String", Some("test str")),
533 ("String", None),
534 ]"#;
535 let array: Array = ron::de::from_str(array_ron).unwrap();
536 let slice = array.as_slice();
537 assert_eq!(2, slice.len());
538 assert_eq!(
539 "test str".to_owned(),
540 slice[0].get::<String>().expect("slice[0]")
541 );
542
543 assert!(slice[1]
544 .get::<Option<String>>()
545 .expect("slice[1]")
546 .is_none());
547
548 let array_ron = r#"[
550 ("Date", Some(YMD(2019, 8, 19))),
551 ("Date", None),
552 ]"#;
553 let array: Array = ron::de::from_str(array_ron).unwrap();
554 let slice = array.as_slice();
555 assert_eq!(2, slice.len());
556 assert_eq!(
557 Date::from_dmy(19, DateMonth::August, 2019).unwrap(),
558 slice[0].get::<Date>().expect("slice[0]")
559 );
560
561 assert!(slice[1].get::<Option<Date>>().expect("slice[1]").is_none());
562
563 let array_json = r#"[["Fraction",[1,3]],["Fraction",[1,2]]]"#;
565 let array: Array = serde_json::from_str(array_json).unwrap();
566 let slice = array.as_slice();
567 assert_eq!(2, slice.len());
568
569 let fraction = slice[0].get::<Fraction>().expect("slice[0]");
570 assert_eq!(fraction.0.numer(), &1);
571 assert_eq!(fraction.0.denom(), &3);
572
573 let fraction = slice[1].get::<Fraction>().expect("slice[1]");
574 assert_eq!(fraction.0.numer(), &1);
575 assert_eq!(fraction.0.denom(), &2);
576
577 let array_json = r#"[["String","test str"],["String",null]]"#;
579 let array: Array = serde_json::from_str(array_json).unwrap();
580 let slice = array.as_slice();
581 assert_eq!(2, slice.len());
582 assert_eq!(
583 "test str".to_owned(),
584 slice[0].get::<String>().expect("slice[0]")
585 );
586
587 assert!(slice[1]
588 .get::<Option<String>>()
589 .expect("slice[1]")
590 .is_none());
591
592 let array_json = r#"[["Date",{"YMD":[2019,8,19]}],["Date",null]]"#;
594 let array: Array = serde_json::from_str(array_json).unwrap();
595 let slice = array.as_slice();
596 assert_eq!(2, slice.len());
597 assert_eq!(
598 Date::from_dmy(19, DateMonth::August, 2019).unwrap(),
599 slice[0].get::<Date>().expect("slice[0]")
600 );
601
602 assert!(slice[1].get::<Option<Date>>().expect("slice[1]").is_none());
603
604 let list_ron = r#"[
606 ("Fraction", (1, 2)),
607 ]"#;
608 let list: List = ron::de::from_str(list_ron).unwrap();
609 let slice = list.as_slice();
610 assert_eq!(1, slice.len());
611
612 let fraction = slice[0].get::<Fraction>().expect("slice[0]");
613 assert_eq!(fraction.0.numer(), &1);
614 assert_eq!(fraction.0.denom(), &2);
615
616 let list_ron = r#"[
618 ("String", Some("test str")),
619 ("String", None),
620 ]"#;
621 let list: List = ron::de::from_str(list_ron).unwrap();
622 let slice = list.as_slice();
623 assert_eq!(2, slice.len());
624 assert_eq!(
625 "test str".to_owned(),
626 slice[0].get::<String>().expect("slice[0]")
627 );
628
629 assert!(slice[1]
630 .get::<Option<String>>()
631 .expect("slice[1]")
632 .is_none());
633
634 let list_ron = r#"[
636 ("DateTime", Some(YMDhmsTz(2019, 8, 19, 13, 34, 42, 2))),
637 ("DateTime", None),
638 ]"#;
639 let list: List = ron::de::from_str(list_ron).unwrap();
640 let slice = list.as_slice();
641 assert_eq!(2, slice.len());
642 assert_eq!(
643 DateTime::new(2f32, 2019, 8, 19, 13, 34, 42f64).unwrap(),
644 slice[0].get::<DateTime>().expect("slice[0]")
645 );
646
647 assert!(slice[1]
648 .get::<Option<DateTime>>()
649 .expect("slice[1]")
650 .is_none());
651 }
652
653 #[test]
654 fn test_serde_roundtrip_collection() {
655 crate::init().unwrap();
656
657 let value_13 = Fraction::new(1, 3);
659 let value_12 = Fraction::new(1, 2);
660
661 let array = Array::new([value_13, value_12]);
662 let array_ser = ron::ser::to_string(&array).unwrap();
663
664 let array_de: Array = ron::de::from_str(array_ser.as_str()).unwrap();
665 let slice_de = array_de.as_slice();
666 let slice = array.as_slice();
667 assert_eq!(slice_de.len(), slice.len());
668
669 let fraction_de = slice_de[0].get::<Fraction>().expect("slice_de[0]");
670 let fraction = slice[0].get::<Fraction>().expect("slice[0]");
671 assert_eq!(fraction_de.0.numer(), fraction.0.numer());
672 assert_eq!(fraction_de.0.denom(), fraction.0.denom());
673
674 let fraction_de = slice_de[1].get::<Fraction>().expect("slice_de[1]");
675 let fraction = slice[1].get::<Fraction>().expect("slice[1]");
676 assert_eq!(fraction_de.0.numer(), fraction.0.numer());
677 assert_eq!(fraction.0.denom(), fraction.0.denom());
678
679 let value_12 = Fraction::new(1, 2);
681
682 let list = List::new([value_12]);
683 let list_ser = ron::ser::to_string(&list).unwrap();
684
685 let list_de: List = ron::de::from_str(list_ser.as_str()).unwrap();
686 let slice_de = list_de.as_slice();
687 let slice = list.as_slice();
688 assert_eq!(slice_de.len(), slice.len());
689
690 let fraction_de = slice_de[0].get::<Fraction>().expect("slice_de[0]");
691 let fraction = slice[0].get::<Fraction>().expect("slice[0]");
692 assert_eq!(fraction_de.0.numer(), fraction.0.numer());
693 assert_eq!(fraction_de.0.denom(), fraction.0.denom());
694 }
695}