gstreamer/format/
clock_time_serde.rs
1use serde::{
4 de::{Deserialize, Deserializer},
5 ser::{Serialize, Serializer},
6};
7
8use crate::ClockTime;
9
10impl Serialize for ClockTime {
11 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12 use std::ops::Deref;
13 self.deref().serialize(serializer)
14 }
15}
16
17impl<'de> Deserialize<'de> for ClockTime {
18 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19 skip_assert_initialized!();
20 u64::deserialize(deserializer).and_then(|value| {
21 ClockTime::try_from(value).map_err(|_| {
22 use serde::de::{Error, Unexpected};
23 D::Error::invalid_value(Unexpected::Unsigned(value), &"valid `ClockTime`")
24 })
25 })
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use crate::ClockTime;
32
33 #[test]
34 fn test_serialize() {
35 crate::init().unwrap();
36
37 let clocktime = Some(ClockTime::from_nseconds(42_123_456_789));
39
40 let pretty_config = ron::ser::PrettyConfig::new().new_line("".to_string());
41
42 let res = ron::ser::to_string_pretty(&clocktime, pretty_config.clone());
43 assert_eq!(Ok("Some(42123456789)".to_owned()), res);
44
45 let res = serde_json::to_string(&clocktime).unwrap();
46 assert_eq!("42123456789".to_owned(), res);
47
48 let clocktime = ClockTime::NONE;
50
51 let res = ron::ser::to_string_pretty(&clocktime, pretty_config);
52 assert_eq!(Ok("None".to_owned()), res);
53
54 let res = serde_json::to_string(&clocktime).unwrap();
55 assert_eq!("null".to_owned(), res);
56 }
57
58 #[test]
59 fn test_deserialize() {
60 crate::init().unwrap();
61
62 let clocktime_ron = "Some(42123456789)";
64 let clocktime: Option<ClockTime> = ron::de::from_str(clocktime_ron).unwrap();
65 let clocktime = clocktime.unwrap();
66 assert_eq!(clocktime.seconds(), 42);
67 assert_eq!(clocktime.mseconds(), 42_123);
68 assert_eq!(clocktime.useconds(), 42_123_456);
69 assert_eq!(clocktime.nseconds(), 42_123_456_789);
70
71 let clocktime_json = "42123456789";
72 let clocktime: Option<ClockTime> = serde_json::from_str(clocktime_json).unwrap();
73 let clocktime = clocktime.unwrap();
74 assert_eq!(clocktime.seconds(), 42);
75 assert_eq!(clocktime.mseconds(), 42_123);
76 assert_eq!(clocktime.useconds(), 42_123_456);
77 assert_eq!(clocktime.nseconds(), 42_123_456_789);
78
79 let clocktime_ron = "None";
81 let clocktime: Option<ClockTime> = ron::de::from_str(clocktime_ron).unwrap();
82 assert!(clocktime.is_none());
83
84 let clocktime_json = "null";
85 let clocktime: Option<ClockTime> = serde_json::from_str(clocktime_json).unwrap();
86 assert!(clocktime.is_none());
87 assert!(clocktime.is_none());
88 }
89
90 #[test]
91 fn test_serde_roundtrip() {
92 crate::init().unwrap();
93
94 let clocktime = ClockTime::from_nseconds(42_123_456_789);
96 let clocktime_ser = ron::ser::to_string(&clocktime).unwrap();
97 let clocktime: ClockTime = ron::de::from_str(clocktime_ser.as_str()).unwrap();
98 assert_eq!(clocktime.seconds(), 42);
99 assert_eq!(clocktime.mseconds(), 42_123);
100 assert_eq!(clocktime.useconds(), 42_123_456);
101 assert_eq!(clocktime.nseconds(), 42_123_456_789);
102
103 let clocktime = Some(ClockTime::from_nseconds(42_123_456_789));
105 let clocktime_ser = ron::ser::to_string(&clocktime).unwrap();
106 let clocktime: Option<ClockTime> = ron::de::from_str(clocktime_ser.as_str()).unwrap();
107 let clocktime = clocktime.unwrap();
108 assert_eq!(clocktime.seconds(), 42);
109 assert_eq!(clocktime.mseconds(), 42_123);
110 assert_eq!(clocktime.useconds(), 42_123_456);
111 assert_eq!(clocktime.nseconds(), 42_123_456_789);
112
113 let clocktime = ClockTime::NONE;
115 let clocktime_ser = ron::ser::to_string(&clocktime).unwrap();
116 let clocktime: Option<ClockTime> = ron::de::from_str(clocktime_ser.as_str()).unwrap();
117 assert!(clocktime.is_none());
118 }
119}