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