gstreamer/format/
format_serde.rs
1use serde::{
4 de::{Deserialize, Deserializer},
5 ser::{Serialize, Serializer},
6};
7
8use crate::format::{Buffers, Bytes, Default, Other, Percent, Undefined};
9
10macro_rules! impl_serde(
16 ($t:ident, $inner:ty) => {
17 impl Serialize for $t {
18 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
19 use std::ops::Deref;
20 self.deref().serialize(serializer)
21 }
22 }
23
24 impl<'de> Deserialize<'de> for $t {
25 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
26 skip_assert_initialized!();
27 <$inner>::deserialize(deserializer)
28 .and_then(|value| {
29 $t::try_from(value).map_err(|_| {
30 use serde::de::{Error, Unexpected};
31 D::Error::invalid_value(
32 Unexpected::Unsigned(value.into()),
33 &concat!("valid ", stringify!($t)),
34 )
35 })
36 })
37 }
38 }
39 }
40);
41
42impl_serde!(Buffers, u64);
43impl_serde!(Bytes, u64);
44impl_serde!(Default, u64);
45impl_serde!(Other, u64);
46impl_serde!(Percent, u32);
47
48impl Serialize for Undefined {
49 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
50 use std::ops::Deref;
51 self.deref().serialize(serializer)
52 }
53}
54
55impl<'de> Deserialize<'de> for Undefined {
56 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
57 skip_assert_initialized!();
58 i64::deserialize(deserializer).map(Into::into)
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use crate::{
65 format::{prelude::*, Default, Other, Undefined},
66 ClockTime, Format, GenericFormattedValue,
67 };
68
69 #[test]
70 fn test_serialize() {
71 let pretty_config = ron::ser::PrettyConfig::new().new_line("".to_string());
72
73 let value = GenericFormattedValue::from(Undefined::from(42));
74 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
75 assert_eq!(Ok("Undefined(42)".to_owned()), res);
76 let res = serde_json::to_string(&value).unwrap();
77 assert_eq!("{\"Undefined\":42}".to_owned(), res);
78
79 let value = GenericFormattedValue::from(42.default_format());
80 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
81 assert_eq!(Ok("Default(Some(42))".to_owned()), res);
82 let res = serde_json::to_string(&value).unwrap();
83 assert_eq!("{\"Default\":42}".to_owned(), res);
84
85 let value = GenericFormattedValue::from(Default::NONE);
86 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
87 assert_eq!(Ok("Default(None)".to_owned()), res);
88 let res = serde_json::to_string(&value).unwrap();
89 assert_eq!("{\"Default\":null}".to_owned(), res);
90
91 let value = GenericFormattedValue::from(42.bytes());
92 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
93 assert_eq!(Ok("Bytes(Some(42))".to_owned()), res);
94 let res = serde_json::to_string(&value).unwrap();
95 assert_eq!("{\"Bytes\":42}".to_owned(), res);
96
97 let value = GenericFormattedValue::from(ClockTime::from_nseconds(42_123_456_789));
98 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
99 assert_eq!(Ok("Time(Some(42123456789))".to_owned()), res);
100 let res = serde_json::to_string(&value).unwrap();
101 assert_eq!("{\"Time\":42123456789}".to_owned(), res);
102
103 let value = GenericFormattedValue::from(42.buffers());
104 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
105 assert_eq!(Ok("Buffers(Some(42))".to_owned()), res);
106 let res = serde_json::to_string(&value).unwrap();
107 assert_eq!("{\"Buffers\":42}".to_owned(), res);
108
109 let percent = 0.42.percent_ratio();
110 let value = GenericFormattedValue::from(percent);
111 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
112 assert_eq!(Ok("Percent(Some(420000))".to_owned()), res);
113 let res = serde_json::to_string(&value).unwrap();
114 assert_eq!("{\"Percent\":420000}".to_owned(), res);
115
116 let other = Other::try_from(42).ok();
117 let value = GenericFormattedValue::Other(Format::Default, other);
118 let res = ron::ser::to_string_pretty(&value, pretty_config.clone());
119 assert_eq!(Ok("Other(Default, Some(42))".to_owned()), res);
120 let res = serde_json::to_string(&value).unwrap();
121 assert_eq!("{\"Other\":[\"Default\",42]}".to_owned(), res);
122
123 let value = GenericFormattedValue::new(Format::__Unknown(7), 42);
124 let res = ron::ser::to_string_pretty(&value, pretty_config);
125 assert_eq!(Ok("Other(__Unknown(7), Some(42))".to_owned()), res);
126 let res = serde_json::to_string(&value).unwrap();
127 assert_eq!("{\"Other\":[{\"__Unknown\":7},42]}".to_owned(), res);
128 }
129
130 #[test]
131 fn test_deserialize() {
132 let value_ron = "Default(Some(42))";
133 let value_de: GenericFormattedValue = ron::de::from_str(value_ron).unwrap();
134 assert_eq!(value_de, GenericFormattedValue::from(42.default_format()));
135
136 let value_json = "{\"Default\":42}";
137 let value_de: GenericFormattedValue = serde_json::from_str(value_json).unwrap();
138 assert_eq!(value_de, GenericFormattedValue::from(Default::from_u64(42)));
139
140 let value_ron = "Other(Buffers, Some(42))";
141 let gfv_value = GenericFormattedValue::Other(Format::Buffers, Some(42 * Other::ONE));
142
143 let value_de: GenericFormattedValue = ron::de::from_str(value_ron).unwrap();
144 assert_eq!(value_de, gfv_value);
145
146 let value_json = "{\"Other\":[\"Buffers\",42]}";
147 let value_de: GenericFormattedValue = serde_json::from_str(value_json).unwrap();
148 assert_eq!(value_de, gfv_value);
149 }
150
151 #[test]
152 fn test_serde_roundtrip() {
153 macro_rules! test_roundrip(
154 ($value:expr) => {
155 let value_ser = ron::ser::to_string(&$value).unwrap();
156 let value_de: GenericFormattedValue = ron::de::from_str(value_ser.as_str()).unwrap();
157 assert_eq!(value_de, $value);
158 }
159 );
160
161 test_roundrip!(GenericFormattedValue::Undefined(Undefined::from(42)));
162 test_roundrip!(GenericFormattedValue::from(Default::from_u64(42)));
163 test_roundrip!(GenericFormattedValue::from(42.bytes()));
164 test_roundrip!(GenericFormattedValue::from(ClockTime::from_nseconds(
165 42_123_456_789
166 )));
167 test_roundrip!(GenericFormattedValue::from(42.buffers()));
168 test_roundrip!(GenericFormattedValue::from(42.percent()));
169 let gfv_value = GenericFormattedValue::Other(Format::Default, Other::try_from(42).ok());
170 test_roundrip!(gfv_value);
171 test_roundrip!(GenericFormattedValue::new(Format::__Unknown(7), 42));
172 }
173}