1use serde::{
4 de,
5 de::{Deserialize, Deserializer},
6 ser::{Serialize, Serializer},
7};
8
9use crate::{
10 format::{FormattedValue, FormattedValueIntrinsic, SpecificFormattedValueIntrinsic},
11 Format, FormattedSegment, GenericFormattedValue, Segment, SegmentFlags,
12};
13
14#[derive(serde::Serialize, serde::Deserialize)]
15struct FormattedSegmentSerde {
16 flags: SegmentFlags,
17 rate: f64,
18 applied_rate: f64,
19 format: Format,
20 base: i64,
21 offset: i64,
22 start: i64,
23 stop: i64,
24 time: i64,
25 position: i64,
26 duration: i64,
27}
28
29impl<T: FormattedValueIntrinsic> Serialize for FormattedSegment<T> {
30 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
31 let fmt_seg = unsafe {
32 FormattedSegmentSerde {
33 flags: self.flags(),
34 rate: self.rate(),
35 applied_rate: self.applied_rate(),
36 format: self.format(),
37 base: self.base().into_raw_value(),
38 offset: self.offset().into_raw_value(),
39 start: self.start().into_raw_value(),
40 stop: self.stop().into_raw_value(),
41 time: self.time().into_raw_value(),
42 position: self.position().into_raw_value(),
43 duration: self.duration().into_raw_value(),
44 }
45 };
46 fmt_seg.serialize(serializer)
47 }
48}
49
50impl<'de> Deserialize<'de> for Segment {
51 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
52 skip_assert_initialized!();
53 FormattedSegmentSerde::deserialize(deserializer).map(|fmt_seg_de| {
54 let mut segment = Self::new();
55 segment.set_flags(fmt_seg_de.flags);
56 segment.set_rate(fmt_seg_de.rate);
57 segment.set_applied_rate(fmt_seg_de.applied_rate);
58 segment.set_format(fmt_seg_de.format);
59 segment.set_base(GenericFormattedValue::new(
60 fmt_seg_de.format,
61 fmt_seg_de.base,
62 ));
63 segment.set_offset(GenericFormattedValue::new(
64 fmt_seg_de.format,
65 fmt_seg_de.offset,
66 ));
67 segment.set_start(GenericFormattedValue::new(
68 fmt_seg_de.format,
69 fmt_seg_de.start,
70 ));
71 segment.set_stop(GenericFormattedValue::new(
72 fmt_seg_de.format,
73 fmt_seg_de.stop,
74 ));
75 segment.set_time(GenericFormattedValue::new(
76 fmt_seg_de.format,
77 fmt_seg_de.time,
78 ));
79 segment.set_position(GenericFormattedValue::new(
80 fmt_seg_de.format,
81 fmt_seg_de.position,
82 ));
83 segment.set_duration(GenericFormattedValue::new(
84 fmt_seg_de.format,
85 fmt_seg_de.duration,
86 ));
87
88 segment
89 })
90 }
91}
92
93impl<'de, T: SpecificFormattedValueIntrinsic> Deserialize<'de> for FormattedSegment<T> {
94 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
95 skip_assert_initialized!();
96 Segment::deserialize(deserializer).and_then(|segment| {
97 segment.downcast::<T>().map_err(|segment| {
98 de::Error::custom(format!(
99 "failed to convert segment with format {:?} to {:?}",
100 segment.format(),
101 T::default_format(),
102 ))
103 })
104 })
105 }
106}
107
108#[cfg(test)]
109mod tests {
110 use crate::{ClockTime, Format, GenericFormattedValue, Segment, SegmentFlags};
111
112 #[test]
113 fn test_serialize() {
114 crate::init().unwrap();
115
116 let mut segment = Segment::new();
117 segment.set_flags(SegmentFlags::RESET | SegmentFlags::SEGMENT);
118 segment.set_rate(1f64);
119 segment.set_applied_rate(0.9f64);
120 segment.set_format(Format::Time);
121 segment.set_base(GenericFormattedValue::from(ClockTime::from_nseconds(123)));
122 segment.set_offset(GenericFormattedValue::from(ClockTime::from_nseconds(42)));
123 segment.set_start(GenericFormattedValue::from(ClockTime::from_nseconds(1024)));
124 segment.set_stop(GenericFormattedValue::from(ClockTime::from_nseconds(2048)));
125 segment.set_time(GenericFormattedValue::from(ClockTime::from_nseconds(1042)));
126 segment.set_position(GenericFormattedValue::from(ClockTime::from_nseconds(256)));
127 segment.set_duration(GenericFormattedValue::from(ClockTime::NONE));
128
129 let pretty_config = ron::ser::PrettyConfig::new().new_line("".to_string());
130
131 let res = ron::ser::to_string_pretty(&segment, pretty_config);
132 assert_eq!(
133 Ok(concat!(
134 "(",
135 " flags: \"reset+segment\",",
136 " rate: 1.0,",
137 " applied_rate: 0.9,",
138 " format: Time,",
139 " base: 123,",
140 " offset: 42,",
141 " start: 1024,",
142 " stop: 2048,",
143 " time: 1042,",
144 " position: 256,",
145 " duration: -1,",
146 ")"
147 )
148 .to_owned()),
149 res,
150 );
151 }
152
153 #[test]
154 fn test_deserialize_segment() {
155 crate::init().unwrap();
156
157 let segment_ron = r#"
158 (
159 flags: "reset+segment",
160 rate: 1,
161 applied_rate: 0.9,
162 format: Time,
163 base: 123,
164 offset: 42,
165 start: 1024,
166 stop: 2048,
167 time: 1042,
168 position: 256,
169 duration: -1,
170 )
171 "#;
172
173 let segment: Segment = ron::de::from_str(segment_ron).unwrap();
174 assert_eq!(segment.flags(), SegmentFlags::RESET | SegmentFlags::SEGMENT);
175 assert!((segment.rate() - 1f64).abs() < f64::EPSILON);
176 assert!((segment.applied_rate() - 0.9f64).abs() < f64::EPSILON);
177 assert_eq!(segment.format(), Format::Time);
178 assert_eq!(segment.flags(), SegmentFlags::RESET | SegmentFlags::SEGMENT);
179 assert!((segment.rate() - 1f64).abs() < f64::EPSILON);
180 assert!((segment.applied_rate() - 0.9f64).abs() < f64::EPSILON);
181 assert_eq!(segment.format(), Format::Time);
182 assert_eq!(
183 segment.base(),
184 GenericFormattedValue::from(ClockTime::from_nseconds(123)),
185 );
186 assert_eq!(
187 segment.offset(),
188 GenericFormattedValue::from(ClockTime::from_nseconds(42)),
189 );
190 assert_eq!(
191 segment.start(),
192 GenericFormattedValue::from(ClockTime::from_nseconds(1024)),
193 );
194 assert_eq!(
195 segment.stop(),
196 GenericFormattedValue::from(ClockTime::from_nseconds(2048)),
197 );
198 assert_eq!(
199 segment.time(),
200 GenericFormattedValue::from(ClockTime::from_nseconds(1042)),
201 );
202 assert_eq!(
203 segment.position(),
204 GenericFormattedValue::from(ClockTime::from_nseconds(256)),
205 );
206 assert_eq!(
207 segment.duration(),
208 GenericFormattedValue::from(ClockTime::NONE),
209 );
210 }
211
212 #[test]
213 fn test_deserialize_formatted() {
214 use crate::{format::Time, FormattedSegment};
215
216 crate::init().unwrap();
217
218 let segment_ron = r#"
219 (
220 flags: "reset+segment",
221 rate: 1,
222 applied_rate: 0.9,
223 format: Time,
224 base: 123,
225 offset: 42,
226 start: 1024,
227 stop: 2048,
228 time: 1042,
229 position: 256,
230 duration: -1,
231 )
232 "#;
233
234 let fmt_seg: FormattedSegment<Time> = ron::de::from_str(segment_ron).unwrap();
235 assert_eq!(fmt_seg.flags(), SegmentFlags::RESET | SegmentFlags::SEGMENT);
236 assert!((fmt_seg.rate() - 1f64).abs() < f64::EPSILON);
237 assert!((fmt_seg.applied_rate() - 0.9f64).abs() < f64::EPSILON);
238 assert_eq!(fmt_seg.format(), Format::Time);
239 assert_eq!(fmt_seg.base(), Some(ClockTime::from_nseconds(123)));
240 assert_eq!(fmt_seg.offset(), Some(ClockTime::from_nseconds(42)));
241 assert_eq!(fmt_seg.start(), Some(ClockTime::from_nseconds(1024)));
242 assert_eq!(fmt_seg.stop(), Some(ClockTime::from_nseconds(2048)));
243 assert_eq!(fmt_seg.time(), Some(ClockTime::from_nseconds(1042)));
244 assert_eq!(fmt_seg.position(), Some(ClockTime::from_nseconds(256)));
245 assert_eq!(fmt_seg.duration(), ClockTime::NONE);
246 }
247
248 #[test]
249 fn test_serde_roundtrip() {
250 crate::init().unwrap();
251
252 let mut segment = Segment::new();
253 segment.set_flags(SegmentFlags::RESET | SegmentFlags::SEGMENT);
254 segment.set_rate(1f64);
255 segment.set_applied_rate(0.9f64);
256 segment.set_format(Format::Time);
257 segment.set_base(GenericFormattedValue::from(ClockTime::from_nseconds(123)));
258 segment.set_offset(GenericFormattedValue::from(ClockTime::from_nseconds(42)));
259 segment.set_start(GenericFormattedValue::from(ClockTime::from_nseconds(1024)));
260 segment.set_stop(GenericFormattedValue::from(ClockTime::from_nseconds(2048)));
261 segment.set_time(GenericFormattedValue::from(ClockTime::from_nseconds(1042)));
262 segment.set_position(GenericFormattedValue::from(ClockTime::from_nseconds(256)));
263 segment.set_duration(GenericFormattedValue::from(ClockTime::NONE));
264 let segment_se = ron::ser::to_string(&segment).unwrap();
265
266 let segment_de: Segment = ron::de::from_str(segment_se.as_str()).unwrap();
267 assert_eq!(segment_de.flags(), segment.flags());
268 assert!((segment_de.rate() - segment.rate()).abs() < f64::EPSILON);
269 assert!((segment_de.applied_rate() - segment.applied_rate()).abs() < f64::EPSILON);
270 assert_eq!(segment_de.format(), segment.format());
271 assert_eq!(segment_de.base(), segment.base());
272 assert_eq!(segment_de.offset(), segment.offset());
273 assert_eq!(segment_de.start(), segment.start());
274 assert_eq!(segment_de.stop(), segment.stop());
275 assert_eq!(segment_de.time(), segment.time());
276 assert_eq!(segment_de.position(), segment.position());
277 assert_eq!(segment_de.duration(), segment.duration());
278 }
279}