gstreamer/format/
clock_time_serde.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use 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        // Some
38        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        // None
49        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        // Some
63        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        // None
80        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        // Direct
95        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        // Some
104        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        // None
114        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}