1use super::{
2 deserialize::XTypesDeserialize,
3 deserializer::{
4 DeserializeAppendableStruct, DeserializeArray, DeserializeFinalStruct,
5 DeserializeMutableStruct, DeserializeSequence, XTypesDeserializer,
6 },
7 error::XTypesError,
8};
9use core::str;
10
11const PID_SENTINEL: u16 = 1;
12
13pub struct Xcdr1BeDeserializer<'a> {
14 reader: Reader<'a>,
15}
16
17impl<'a> Xcdr1BeDeserializer<'a> {
18 pub fn new(buffer: &'a [u8]) -> Self {
19 Self {
20 reader: Reader::new(buffer),
21 }
22 }
23}
24
25pub struct Xcdr1LeDeserializer<'a> {
26 reader: Reader<'a>,
27}
28
29impl<'a> Xcdr1LeDeserializer<'a> {
30 pub fn new(buffer: &'a [u8]) -> Self {
31 Self {
32 reader: Reader::new(buffer),
33 }
34 }
35}
36
37pub struct Xcdr2BeDeserializer<'a> {
38 reader: Reader<'a>,
39}
40
41impl<'a> Xcdr2BeDeserializer<'a> {
42 pub fn new(buffer: &'a [u8]) -> Self {
43 Self {
44 reader: Reader::new(buffer),
45 }
46 }
47}
48
49pub struct Xcdr2LeDeserializer<'a> {
50 reader: Reader<'a>,
51}
52
53impl<'a> Xcdr2LeDeserializer<'a> {
54 pub fn new(buffer: &'a [u8]) -> Self {
55 Self {
56 reader: Reader::new(buffer),
57 }
58 }
59}
60
61struct Reader<'a> {
62 buffer: &'a [u8],
63 pos: usize,
64}
65
66impl<'a> Reader<'a> {
67 fn new(buffer: &'a [u8]) -> Self {
68 Self { buffer, pos: 0 }
69 }
70 fn buffer(&self) -> &'a [u8] {
71 &self.buffer[self.pos..]
72 }
73 fn read<const N: usize>(&mut self) -> Result<&'a [u8; N], XTypesError> {
74 if self.pos + N > self.buffer.len() {
75 return Err(XTypesError::InvalidData);
76 }
77 let ret = core::convert::TryFrom::try_from(&self.buffer[self.pos..self.pos + N])
78 .expect("length guaranteed");
79 self.pos += N;
80 Ok(ret)
81 }
82 fn read_all(&mut self, length: usize) -> Result<&'a [u8], XTypesError> {
83 if self.pos + length > self.buffer.len() {
84 return Err(XTypesError::InvalidData);
85 }
86 let ret = &self.buffer[self.pos..self.pos + length];
87 self.pos += length;
88 Ok(ret)
89 }
90
91 fn seek(&mut self, v: usize) {
92 self.pos += v
93 }
94
95 fn seek_padding(&mut self, alignment: usize) {
96 let mask = alignment - 1;
97 self.seek(((self.pos + mask) & !mask) - self.pos)
98 }
99}
100
101fn read_with_padding_v1<const N: usize>(reader: &mut Reader) -> Result<[u8; N], XTypesError> {
102 reader.seek_padding(N);
103 reader.read().cloned()
104}
105
106fn read_with_padding_v2<const N: usize>(reader: &mut Reader) -> Result<[u8; N], XTypesError> {
107 reader.seek_padding(core::cmp::min(N, 4));
108 reader.read().cloned()
109}
110
111fn seek_to_pid_be(reader: &mut Reader, pid: u16) -> Result<(), XTypesError> {
112 loop {
113 let current_pid = u16::from_be_bytes(*reader.read()?);
114 let length = u16::from_be_bytes(*reader.read()?) as usize;
115 if current_pid == pid {
116 return Ok(());
117 } else if current_pid == PID_SENTINEL {
118 return Err(XTypesError::PidNotFound(pid));
119 } else {
120 reader.seek(length);
121 reader.seek_padding(4);
122 }
123 }
124}
125
126fn seek_to_pid_le(reader: &mut Reader, pid: u16) -> Result<(), XTypesError> {
127 loop {
128 let current_pid = u16::from_le_bytes(*reader.read()?);
129 let length = u16::from_le_bytes(*reader.read()?) as usize;
130 if current_pid == pid {
131 return Ok(());
132 } else if current_pid == PID_SENTINEL {
133 return Err(XTypesError::PidNotFound(pid));
134 } else {
135 reader.seek(length);
136 reader.seek_padding(4);
137 }
138 }
139}
140
141fn seek_to_optional_pid_be(reader: &mut Reader, pid: u16) -> Result<bool, XTypesError> {
142 loop {
143 let current_pid = u16::from_be_bytes(*reader.read()?);
144 let length = u16::from_be_bytes(*reader.read()?) as usize;
145 if current_pid == pid {
146 return Ok(true);
147 } else if current_pid == PID_SENTINEL {
148 return Ok(false);
149 } else {
150 reader.seek(length);
151 reader.seek_padding(4);
152 }
153 }
154}
155
156fn seek_to_optional_pid_le(reader: &mut Reader, pid: u16) -> Result<bool, XTypesError> {
157 loop {
158 let current_pid = u16::from_le_bytes(*reader.read()?);
159 let length = u16::from_le_bytes(*reader.read()?) as usize;
160 if current_pid == pid {
161 return Ok(true);
162 } else if current_pid == PID_SENTINEL {
163 return Ok(false);
164 } else {
165 reader.seek(length);
166 reader.seek_padding(4);
167 }
168 }
169}
170
171fn into_bool(v: u8) -> Result<bool, XTypesError> {
172 match v {
173 0 => Ok(false),
174 1 => Ok(true),
175 _ => Err(XTypesError::InvalidData),
176 }
177}
178
179struct DelimitedCdrDecoder<'a, D> {
180 deserializer: &'a mut D,
181}
182impl<'de, D> DeserializeAppendableStruct<'de> for DelimitedCdrDecoder<'_, D>
183where
184 for<'a> &'a mut D: XTypesDeserializer<'de>,
185{
186 fn deserialize_field<T: XTypesDeserialize<'de>>(
187 &mut self,
188 _name: &str,
189 ) -> Result<T, XTypesError> {
190 u32::deserialize(&mut *self.deserializer)?;
191 T::deserialize(&mut *self.deserializer)
192 }
193}
194
195struct PlCdrBeDecoder<'a> {
196 buffer: &'a [u8],
197}
198
199impl<'de> DeserializeMutableStruct<'de> for PlCdrBeDecoder<'de> {
200 fn deserialize_field<T: XTypesDeserialize<'de>>(
201 &mut self,
202 pid: u32,
203 _name: &str,
204 ) -> Result<T, XTypesError> {
205 let mut reader = Reader::new(self.buffer);
206 seek_to_pid_be(&mut reader, pid as u16)?;
207 T::deserialize(&mut Xcdr1BeDeserializer { reader })
208 }
209
210 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
211 &mut self,
212 pid: u32,
213 _name: &str,
214 ) -> Result<Option<T>, XTypesError> {
215 let mut reader = Reader::new(self.buffer);
216 Ok(if seek_to_optional_pid_be(&mut reader, pid as u16)? {
217 Some(T::deserialize(&mut Xcdr1BeDeserializer { reader })?)
218 } else {
219 None
220 })
221 }
222}
223
224struct PlCdrLeDecoder<'a> {
225 buffer: &'a [u8],
226}
227
228impl<'de> DeserializeMutableStruct<'de> for PlCdrLeDecoder<'de> {
229 fn deserialize_field<T: XTypesDeserialize<'de>>(
230 &mut self,
231 pid: u32,
232 _name: &str,
233 ) -> Result<T, XTypesError> {
234 let mut reader = Reader::new(self.buffer);
235 seek_to_pid_le(&mut reader, pid as u16)?;
236 T::deserialize(&mut Xcdr1LeDeserializer { reader })
237 }
238
239 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
240 &mut self,
241 pid: u32,
242 _name: &str,
243 ) -> Result<Option<T>, XTypesError> {
244 let mut reader = Reader::new(self.buffer);
245 Ok(if seek_to_optional_pid_le(&mut reader, pid as u16)? {
246 Some(T::deserialize(&mut Xcdr1LeDeserializer { reader })?)
247 } else {
248 None
249 })
250 }
251}
252
253struct PlCdr2BeDecoder<'a> {
254 buffer: &'a [u8],
255}
256
257impl<'de> DeserializeMutableStruct<'de> for PlCdr2BeDecoder<'de> {
258 fn deserialize_field<T: XTypesDeserialize<'de>>(
259 &mut self,
260 pid: u32,
261 _name: &str,
262 ) -> Result<T, XTypesError> {
263 let mut reader = Reader::new(self.buffer);
264 seek_to_pid_be(&mut reader, pid as u16)?;
265 T::deserialize(&mut Xcdr2BeDeserializer { reader })
266 }
267
268 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
269 &mut self,
270 pid: u32,
271 _name: &str,
272 ) -> Result<Option<T>, XTypesError> {
273 let mut reader = Reader::new(self.buffer);
274 Ok(if seek_to_optional_pid_be(&mut reader, pid as u16)? {
275 Some(T::deserialize(&mut Xcdr2BeDeserializer { reader })?)
276 } else {
277 None
278 })
279 }
280}
281
282struct PlCdr2LeDecoder<'a> {
283 buffer: &'a [u8],
284}
285
286impl<'de> DeserializeMutableStruct<'de> for PlCdr2LeDecoder<'de> {
287 fn deserialize_field<T: XTypesDeserialize<'de>>(
288 &mut self,
289 pid: u32,
290 _name: &str,
291 ) -> Result<T, XTypesError> {
292 let mut reader = Reader::new(self.buffer);
293 seek_to_pid_le(&mut reader, pid as u16)?;
294 T::deserialize(&mut Xcdr2LeDeserializer { reader })
295 }
296
297 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
298 &mut self,
299 pid: u32,
300 _name: &str,
301 ) -> Result<Option<T>, XTypesError> {
302 let mut reader = Reader::new(self.buffer);
303 Ok(if seek_to_optional_pid_le(&mut reader, pid as u16)? {
304 Some(T::deserialize(&mut Xcdr2LeDeserializer { reader })?)
305 } else {
306 None
307 })
308 }
309}
310
311struct ArrayDecoder<'a, D> {
312 deserializer: &'a mut D,
313}
314impl<'de, D> DeserializeArray<'de> for ArrayDecoder<'_, D>
315where
316 for<'a> &'a mut D: XTypesDeserializer<'de>,
317{
318 fn deserialize_element<T: XTypesDeserialize<'de>>(&mut self) -> Result<T, XTypesError> {
319 T::deserialize(&mut *self.deserializer)
320 }
321}
322
323struct SequenceDecoder<'a, D> {
324 deserializer: &'a mut D,
325 len: usize,
326}
327impl<'de, D> DeserializeSequence<'de> for SequenceDecoder<'_, D>
328where
329 for<'a> &'a mut D: XTypesDeserializer<'de>,
330{
331 fn len(&self) -> usize {
332 self.len
333 }
334
335 fn is_empty(&self) -> bool {
336 self.len == 0
337 }
338
339 fn deserialize_element<T: XTypesDeserialize<'de>>(&mut self) -> Result<T, XTypesError> {
340 T::deserialize(&mut *self.deserializer)
341 }
342}
343
344struct PlainCdrBeDecoder<'a, 'de> {
345 deserializer: &'a mut Xcdr1BeDeserializer<'de>,
346}
347impl<'de> DeserializeAppendableStruct<'de> for PlainCdrBeDecoder<'_, 'de> {
348 fn deserialize_field<T: XTypesDeserialize<'de>>(
349 &mut self,
350 _name: &str,
351 ) -> Result<T, XTypesError> {
352 T::deserialize(&mut *self.deserializer)
353 }
354}
355
356impl<'de> DeserializeFinalStruct<'de> for PlainCdrBeDecoder<'_, 'de> {
357 fn deserialize_field<T: XTypesDeserialize<'de>>(
358 &mut self,
359 _name: &str,
360 ) -> Result<T, XTypesError> {
361 T::deserialize(&mut *self.deserializer)
362 }
363
364 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
365 &mut self,
366 _name: &str,
367 ) -> Result<Option<T>, XTypesError> {
368 self.deserializer.reader.seek_padding(4);
369 let _pid = u16::deserialize(&mut *self.deserializer)?;
370 let length = u16::deserialize(&mut *self.deserializer)?;
371 if length == 0 {
372 Ok(None)
373 } else {
374 Ok(Some(T::deserialize(&mut *self.deserializer)?))
375 }
376 }
377}
378
379struct PlainCdrLeDecoder<'a, 'de> {
380 deserializer: &'a mut Xcdr1LeDeserializer<'de>,
381}
382impl<'de> DeserializeAppendableStruct<'de> for PlainCdrLeDecoder<'_, 'de> {
383 fn deserialize_field<T: XTypesDeserialize<'de>>(
384 &mut self,
385 _name: &str,
386 ) -> Result<T, XTypesError> {
387 T::deserialize(&mut *self.deserializer)
388 }
389}
390
391impl<'de> DeserializeFinalStruct<'de> for PlainCdrLeDecoder<'_, 'de> {
392 fn deserialize_field<T: XTypesDeserialize<'de>>(
393 &mut self,
394 _name: &str,
395 ) -> Result<T, XTypesError> {
396 T::deserialize(&mut *self.deserializer)
397 }
398
399 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
400 &mut self,
401 _name: &str,
402 ) -> Result<Option<T>, XTypesError> {
403 self.deserializer.reader.seek_padding(4);
404 let _pid = u16::deserialize(&mut *self.deserializer)?;
405 let length = u16::deserialize(&mut *self.deserializer)?;
406 if length == 0 {
407 Ok(None)
408 } else {
409 Ok(Some(T::deserialize(&mut *self.deserializer)?))
410 }
411 }
412}
413
414struct PlainCdr2Decoder<'a, D> {
415 deserializer: &'a mut D,
416}
417impl<'de, D> DeserializeFinalStruct<'de> for PlainCdr2Decoder<'_, D>
418where
419 for<'a> &'a mut D: XTypesDeserializer<'de>,
420{
421 fn deserialize_field<T: XTypesDeserialize<'de>>(
422 &mut self,
423 _name: &str,
424 ) -> Result<T, XTypesError> {
425 T::deserialize(&mut *self.deserializer)
426 }
427
428 fn deserialize_optional_field<T: XTypesDeserialize<'de>>(
429 &mut self,
430 _name: &str,
431 ) -> Result<Option<T>, XTypesError> {
432 if bool::deserialize(&mut *self.deserializer)? {
433 Ok(Some(T::deserialize(&mut *self.deserializer)?))
434 } else {
435 Ok(None)
436 }
437 }
438}
439
440impl<'de> XTypesDeserializer<'de> for &mut Xcdr1BeDeserializer<'de> {
441 fn deserialize_final_struct(self) -> Result<impl DeserializeFinalStruct<'de>, XTypesError> {
442 Ok(PlainCdrBeDecoder { deserializer: self })
443 }
444 fn deserialize_appendable_struct(
445 self,
446 ) -> Result<impl DeserializeAppendableStruct<'de>, XTypesError> {
447 Ok(PlainCdrBeDecoder { deserializer: self })
448 }
449 fn deserialize_mutable_struct(self) -> Result<impl DeserializeMutableStruct<'de>, XTypesError> {
450 Ok(PlCdrBeDecoder {
451 buffer: self.reader.buffer(),
452 })
453 }
454 fn deserialize_array(self) -> Result<impl DeserializeArray<'de>, XTypesError> {
455 Ok(ArrayDecoder { deserializer: self })
456 }
457 fn deserialize_sequence(self) -> Result<impl DeserializeSequence<'de>, XTypesError> {
458 let len = self.deserialize_uint32()? as usize;
459 Ok(SequenceDecoder {
460 deserializer: self,
461 len,
462 })
463 }
464
465 fn deserialize_boolean(self) -> Result<bool, XTypesError> {
466 into_bool(self.deserialize_uint8()?)
467 }
468 fn deserialize_int8(self) -> Result<i8, XTypesError> {
469 Ok(i8::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
470 }
471 fn deserialize_int16(self) -> Result<i16, XTypesError> {
472 Ok(i16::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
473 }
474 fn deserialize_int32(self) -> Result<i32, XTypesError> {
475 Ok(i32::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
476 }
477 fn deserialize_int64(self) -> Result<i64, XTypesError> {
478 Ok(i64::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
479 }
480 fn deserialize_uint8(self) -> Result<u8, XTypesError> {
481 Ok(u8::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
482 }
483 fn deserialize_uint16(self) -> Result<u16, XTypesError> {
484 Ok(u16::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
485 }
486 fn deserialize_uint32(self) -> Result<u32, XTypesError> {
487 Ok(u32::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
488 }
489 fn deserialize_uint64(self) -> Result<u64, XTypesError> {
490 Ok(u64::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
491 }
492 fn deserialize_float32(self) -> Result<f32, XTypesError> {
493 Ok(f32::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
494 }
495 fn deserialize_float64(self) -> Result<f64, XTypesError> {
496 Ok(f64::from_be_bytes(read_with_padding_v1(&mut self.reader)?))
497 }
498 fn deserialize_char8(self) -> Result<char, XTypesError> {
499 Ok(self.deserialize_uint8()? as char)
500 }
501 fn deserialize_string(self) -> Result<&'de str, XTypesError> {
502 str::from_utf8(
503 self.deserialize_byte_sequence()?
504 .split_last()
505 .ok_or(XTypesError::InvalidData)?
506 .1,
507 )
508 .map_err(|_| XTypesError::InvalidData)
509 }
510 fn deserialize_byte_sequence(self) -> Result<&'de [u8], XTypesError> {
511 let length = self.deserialize_uint32()? as usize;
512 self.reader.read_all(length)
513 }
514
515 fn deserialize_byte_array<const N: usize>(self) -> Result<&'de [u8; N], XTypesError> {
516 self.reader.read()
517 }
518}
519
520impl<'de> XTypesDeserializer<'de> for &mut Xcdr1LeDeserializer<'de> {
521 fn deserialize_final_struct(self) -> Result<impl DeserializeFinalStruct<'de>, XTypesError> {
522 Ok(PlainCdrLeDecoder { deserializer: self })
523 }
524 fn deserialize_appendable_struct(
525 self,
526 ) -> Result<impl DeserializeAppendableStruct<'de>, XTypesError> {
527 Ok(PlainCdrLeDecoder { deserializer: self })
528 }
529 fn deserialize_mutable_struct(self) -> Result<impl DeserializeMutableStruct<'de>, XTypesError> {
530 Ok(PlCdrLeDecoder {
531 buffer: self.reader.buffer(),
532 })
533 }
534 fn deserialize_array(self) -> Result<impl DeserializeArray<'de>, XTypesError> {
535 Ok(ArrayDecoder { deserializer: self })
536 }
537 fn deserialize_sequence(self) -> Result<impl DeserializeSequence<'de>, XTypesError> {
538 let len = self.deserialize_uint32()? as usize;
539 Ok(SequenceDecoder {
540 deserializer: self,
541 len,
542 })
543 }
544
545 fn deserialize_boolean(self) -> Result<bool, XTypesError> {
546 into_bool(self.deserialize_uint8()?)
547 }
548 fn deserialize_uint8(self) -> Result<u8, XTypesError> {
549 Ok(u8::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
550 }
551 fn deserialize_uint16(self) -> Result<u16, XTypesError> {
552 Ok(u16::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
553 }
554 fn deserialize_uint32(self) -> Result<u32, XTypesError> {
555 Ok(u32::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
556 }
557 fn deserialize_uint64(self) -> Result<u64, XTypesError> {
558 Ok(u64::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
559 }
560 fn deserialize_int8(self) -> Result<i8, XTypesError> {
561 Ok(i8::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
562 }
563 fn deserialize_int16(self) -> Result<i16, XTypesError> {
564 Ok(i16::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
565 }
566 fn deserialize_int32(self) -> Result<i32, XTypesError> {
567 Ok(i32::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
568 }
569 fn deserialize_int64(self) -> Result<i64, XTypesError> {
570 Ok(i64::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
571 }
572 fn deserialize_float32(self) -> Result<f32, XTypesError> {
573 Ok(f32::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
574 }
575 fn deserialize_float64(self) -> Result<f64, XTypesError> {
576 Ok(f64::from_le_bytes(read_with_padding_v1(&mut self.reader)?))
577 }
578 fn deserialize_char8(self) -> Result<char, XTypesError> {
579 Ok(self.deserialize_uint8()? as char)
580 }
581 fn deserialize_string(self) -> Result<&'de str, XTypesError> {
582 str::from_utf8(
583 self.deserialize_byte_sequence()?
584 .split_last()
585 .ok_or(XTypesError::InvalidData)?
586 .1,
587 )
588 .map_err(|_| XTypesError::InvalidData)
589 }
590 fn deserialize_byte_sequence(self) -> Result<&'de [u8], XTypesError> {
591 let length = self.deserialize_uint32()? as usize;
592 self.reader.read_all(length)
593 }
594 fn deserialize_byte_array<const N: usize>(self) -> Result<&'de [u8; N], XTypesError> {
595 self.reader.read()
596 }
597}
598
599impl<'de> XTypesDeserializer<'de> for &mut Xcdr2BeDeserializer<'de> {
600 fn deserialize_final_struct(self) -> Result<impl DeserializeFinalStruct<'de>, XTypesError> {
601 Ok(PlainCdr2Decoder { deserializer: self })
602 }
603 fn deserialize_appendable_struct(
604 self,
605 ) -> Result<impl DeserializeAppendableStruct<'de>, XTypesError> {
606 Ok(DelimitedCdrDecoder { deserializer: self })
607 }
608 fn deserialize_mutable_struct(self) -> Result<impl DeserializeMutableStruct<'de>, XTypesError> {
609 Ok(PlCdr2BeDecoder {
610 buffer: self.reader.buffer(),
611 })
612 }
613 fn deserialize_array(self) -> Result<impl DeserializeArray<'de>, XTypesError> {
614 Ok(ArrayDecoder { deserializer: self })
615 }
616 fn deserialize_sequence(self) -> Result<impl DeserializeSequence<'de>, XTypesError> {
617 let len = self.deserialize_uint32()? as usize;
618 Ok(SequenceDecoder {
619 deserializer: self,
620 len,
621 })
622 }
623
624 fn deserialize_boolean(self) -> Result<bool, XTypesError> {
625 into_bool(self.deserialize_uint8()?)
626 }
627 fn deserialize_int8(self) -> Result<i8, XTypesError> {
628 Ok(i8::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
629 }
630 fn deserialize_int16(self) -> Result<i16, XTypesError> {
631 Ok(i16::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
632 }
633 fn deserialize_int32(self) -> Result<i32, XTypesError> {
634 Ok(i32::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
635 }
636 fn deserialize_int64(self) -> Result<i64, XTypesError> {
637 Ok(i64::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
638 }
639 fn deserialize_uint8(self) -> Result<u8, XTypesError> {
640 Ok(u8::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
641 }
642 fn deserialize_uint16(self) -> Result<u16, XTypesError> {
643 Ok(u16::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
644 }
645 fn deserialize_uint32(self) -> Result<u32, XTypesError> {
646 Ok(u32::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
647 }
648 fn deserialize_uint64(self) -> Result<u64, XTypesError> {
649 Ok(u64::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
650 }
651 fn deserialize_float32(self) -> Result<f32, XTypesError> {
652 Ok(f32::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
653 }
654 fn deserialize_float64(self) -> Result<f64, XTypesError> {
655 Ok(f64::from_be_bytes(read_with_padding_v2(&mut self.reader)?))
656 }
657 fn deserialize_char8(self) -> Result<char, XTypesError> {
658 Ok(self.deserialize_uint8()? as char)
659 }
660 fn deserialize_string(self) -> Result<&'de str, XTypesError> {
661 str::from_utf8(
662 self.deserialize_byte_sequence()?
663 .split_last()
664 .ok_or(XTypesError::InvalidData)?
665 .1,
666 )
667 .map_err(|_| XTypesError::InvalidData)
668 }
669 fn deserialize_byte_sequence(self) -> Result<&'de [u8], XTypesError> {
670 let length = self.deserialize_uint32()? as usize;
671 self.reader.read_all(length)
672 }
673 fn deserialize_byte_array<const N: usize>(self) -> Result<&'de [u8; N], XTypesError> {
674 self.reader.read()
675 }
676}
677
678impl<'de> XTypesDeserializer<'de> for &mut Xcdr2LeDeserializer<'de> {
679 fn deserialize_final_struct(self) -> Result<impl DeserializeFinalStruct<'de>, XTypesError> {
680 Ok(PlainCdr2Decoder { deserializer: self })
681 }
682 fn deserialize_appendable_struct(
683 self,
684 ) -> Result<impl DeserializeAppendableStruct<'de>, XTypesError> {
685 Ok(DelimitedCdrDecoder {
686 deserializer: &mut *self,
687 })
688 }
689 fn deserialize_mutable_struct(self) -> Result<impl DeserializeMutableStruct<'de>, XTypesError> {
690 Ok(PlCdr2LeDecoder {
691 buffer: self.reader.buffer(),
692 })
693 }
694 fn deserialize_array(self) -> Result<impl DeserializeArray<'de>, XTypesError> {
695 Ok(ArrayDecoder { deserializer: self })
696 }
697 fn deserialize_sequence(self) -> Result<impl DeserializeSequence<'de>, XTypesError> {
698 let len = self.deserialize_uint32()? as usize;
699 Ok(SequenceDecoder {
700 deserializer: self,
701 len,
702 })
703 }
704
705 fn deserialize_boolean(self) -> Result<bool, XTypesError> {
706 into_bool(self.deserialize_uint8()?)
707 }
708 fn deserialize_uint8(self) -> Result<u8, XTypesError> {
709 Ok(u8::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
710 }
711 fn deserialize_uint16(self) -> Result<u16, XTypesError> {
712 Ok(u16::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
713 }
714 fn deserialize_uint32(self) -> Result<u32, XTypesError> {
715 Ok(u32::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
716 }
717 fn deserialize_uint64(self) -> Result<u64, XTypesError> {
718 Ok(u64::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
719 }
720 fn deserialize_int8(self) -> Result<i8, XTypesError> {
721 Ok(i8::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
722 }
723 fn deserialize_int16(self) -> Result<i16, XTypesError> {
724 Ok(i16::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
725 }
726 fn deserialize_int32(self) -> Result<i32, XTypesError> {
727 Ok(i32::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
728 }
729 fn deserialize_int64(self) -> Result<i64, XTypesError> {
730 Ok(i64::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
731 }
732 fn deserialize_float32(self) -> Result<f32, XTypesError> {
733 Ok(f32::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
734 }
735 fn deserialize_float64(self) -> Result<f64, XTypesError> {
736 Ok(f64::from_le_bytes(read_with_padding_v2(&mut self.reader)?))
737 }
738 fn deserialize_char8(self) -> Result<char, XTypesError> {
739 Ok(self.deserialize_uint8()? as char)
740 }
741 fn deserialize_string(self) -> Result<&'de str, XTypesError> {
742 str::from_utf8(
743 self.deserialize_byte_sequence()?
744 .split_last()
745 .ok_or(XTypesError::InvalidData)?
746 .1,
747 )
748 .map_err(|_| XTypesError::InvalidData)
749 }
750 fn deserialize_byte_sequence(self) -> Result<&'de [u8], XTypesError> {
751 let length = self.deserialize_uint32()? as usize;
752 self.reader.read_all(length)
753 }
754 fn deserialize_byte_array<const N: usize>(self) -> Result<&'de [u8; N], XTypesError> {
755 self.reader.read()
756 }
757}
758
759#[cfg(test)]
760mod tests {
761 use crate::xtypes::bytes::Bytes;
762
763 use super::*;
764
765 #[test]
766 fn padding_reader() {
767 let buffer = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
768 let mut reader = Reader::new(buffer);
769 reader.seek(1);
770 reader.seek_padding(4);
771 assert_eq!(reader.pos, 4);
772 let mut reader = Reader::new(buffer);
773 reader.seek(2);
774 reader.seek_padding(4);
775 assert_eq!(reader.pos, 4);
776 let mut reader = Reader::new(buffer);
777 reader.seek(3);
778 reader.seek_padding(4);
779 assert_eq!(reader.pos, 4);
780 let mut reader = Reader::new(buffer);
781 reader.seek(4);
782 reader.seek_padding(4);
783 assert_eq!(reader.pos, 4);
784 let mut reader = Reader::new(buffer);
785 reader.seek(5);
786 reader.seek_padding(4);
787 assert_eq!(reader.pos, 8);
788
789 let mut reader = Reader::new(buffer);
790 reader.seek(1);
791 reader.seek_padding(8);
792 assert_eq!(reader.pos, 8);
793 let mut reader = Reader::new(buffer);
794 reader.seek(2);
795 reader.seek_padding(8);
796 assert_eq!(reader.pos, 8);
797 let mut reader = Reader::new(buffer);
798 reader.seek(7);
799 reader.seek_padding(8);
800 assert_eq!(reader.pos, 8);
801 let mut reader = Reader::new(buffer);
802 reader.seek(8);
803 reader.seek_padding(8);
804 assert_eq!(reader.pos, 8);
805 let mut reader = Reader::new(buffer);
806 reader.seek(9);
807 reader.seek_padding(8);
808 assert_eq!(reader.pos, 16);
809 }
810
811 fn deserialize_v1_be<'de, T: XTypesDeserialize<'de>>(
812 data: &'de [u8],
813 ) -> Result<T, XTypesError> {
814 T::deserialize(&mut Xcdr1BeDeserializer {
815 reader: Reader::new(data),
816 })
817 }
818 fn deserialize_v1_le<'de, T: XTypesDeserialize<'de>>(
819 data: &'de [u8],
820 ) -> Result<T, XTypesError> {
821 T::deserialize(&mut Xcdr1LeDeserializer {
822 reader: Reader::new(data),
823 })
824 }
825 fn deserialize_v2_be<'de, T: XTypesDeserialize<'de>>(
826 data: &'de [u8],
827 ) -> Result<T, XTypesError> {
828 T::deserialize(&mut Xcdr2BeDeserializer {
829 reader: Reader::new(data),
830 })
831 }
832 fn deserialize_v2_le<'de, T: XTypesDeserialize<'de>>(
833 data: &'de [u8],
834 ) -> Result<T, XTypesError> {
835 T::deserialize(&mut Xcdr2LeDeserializer {
836 reader: Reader::new(data),
837 })
838 }
839 #[test]
840 fn deserialize_bool() {
841 let expected = Ok(true);
842 assert_eq!(deserialize_v1_be(&[1]), expected);
843 assert_eq!(deserialize_v1_le(&[1]), expected);
844 assert_eq!(deserialize_v2_be(&[1]), expected);
845 assert_eq!(deserialize_v2_le(&[1]), expected);
846 let expected = Ok(false);
847 assert_eq!(deserialize_v1_be(&[0]), expected);
848 assert_eq!(deserialize_v1_le(&[0]), expected);
849 assert_eq!(deserialize_v2_be(&[0]), expected);
850 assert_eq!(deserialize_v2_le(&[0]), expected);
851 let expected = Err(XTypesError::InvalidData);
852 assert_eq!(deserialize_v1_be::<bool>(&[2]), expected);
853 assert_eq!(deserialize_v1_le::<bool>(&[2]), expected);
854 assert_eq!(deserialize_v2_be::<bool>(&[2]), expected);
855 assert_eq!(deserialize_v2_le::<bool>(&[2]), expected);
856 }
857 #[test]
858 fn deserialize_u8() {
859 let expected = Ok(1_u8);
860 assert_eq!(deserialize_v1_be(&[1]), expected);
861 assert_eq!(deserialize_v1_le(&[1]), expected);
862 assert_eq!(deserialize_v2_be(&[1]), expected);
863 assert_eq!(deserialize_v2_le(&[1]), expected);
864 }
865 #[test]
866 fn deserialize_u16() {
867 let expected = Ok(1_u16);
868 assert_eq!(deserialize_v1_be(&[0, 1]), expected);
869 assert_eq!(deserialize_v1_le(&[1, 0]), expected);
870 assert_eq!(deserialize_v2_be(&[0, 1]), expected);
871 assert_eq!(deserialize_v2_le(&[1, 0]), expected);
872 }
873 #[test]
874 fn deserialize_u32() {
875 let expected = Ok(1_u32);
876 assert_eq!(deserialize_v1_be(&[0, 0, 0, 1]), expected);
877 assert_eq!(deserialize_v1_le(&[1, 0, 0, 0]), expected);
878 assert_eq!(deserialize_v2_be(&[0, 0, 0, 1]), expected);
879 assert_eq!(deserialize_v2_le(&[1, 0, 0, 0]), expected);
880 }
881 #[test]
882 fn deserialize_u64() {
883 let expected = Ok(7_u64);
884 assert_eq!(deserialize_v1_be(&[0, 0, 0, 0, 0, 0, 0, 7,]), expected);
885 assert_eq!(deserialize_v1_le(&[7, 0, 0, 0, 0, 0, 0, 0,]), expected);
886 assert_eq!(deserialize_v2_be(&[0, 0, 0, 0, 0, 0, 0, 7,]), expected);
887 assert_eq!(deserialize_v2_le(&[7, 0, 0, 0, 0, 0, 0, 0,]), expected);
888 }
889 #[test]
890 fn deserialize_i8() {
891 let expected = Ok(1_i8);
892 assert_eq!(deserialize_v1_be(&[1]), expected);
893 assert_eq!(deserialize_v1_le(&[1]), expected);
894 assert_eq!(deserialize_v2_be(&[1]), expected);
895 assert_eq!(deserialize_v2_le(&[1]), expected);
896 }
897 #[test]
898 fn deserialize_i16() {
899 let expected = Ok(1_i16);
900 assert_eq!(deserialize_v1_be(&[0, 1]), expected);
901 assert_eq!(deserialize_v1_le(&[1, 0]), expected);
902 assert_eq!(deserialize_v2_be(&[0, 1]), expected);
903 assert_eq!(deserialize_v2_le(&[1, 0]), expected);
904 }
905 #[test]
906 fn deserialize_i32() {
907 let expected = Ok(1_i32);
908 assert_eq!(deserialize_v1_be(&[0, 0, 0, 1]), expected);
909 assert_eq!(deserialize_v1_le(&[1, 0, 0, 0]), expected);
910 assert_eq!(deserialize_v2_be(&[0, 0, 0, 1]), expected);
911 assert_eq!(deserialize_v2_le(&[1, 0, 0, 0]), expected);
912 }
913 #[test]
914 fn deserialize_i64() {
915 let expected = Ok(7_i64);
916 assert_eq!(deserialize_v1_be(&[0, 0, 0, 0, 0, 0, 0, 7,]), expected);
917 assert_eq!(deserialize_v1_le(&[7, 0, 0, 0, 0, 0, 0, 0,]), expected);
918 assert_eq!(deserialize_v2_be(&[0, 0, 0, 0, 0, 0, 0, 7,]), expected);
919 assert_eq!(deserialize_v2_le(&[7, 0, 0, 0, 0, 0, 0, 0,]), expected);
920 }
921 #[test]
922 fn deserialize_f32() {
923 let expected = Ok(core::f32::MIN_POSITIVE);
924 assert_eq!(deserialize_v1_be(&[0x00, 0x80, 0x00, 0x00]), expected);
925 assert_eq!(deserialize_v1_le(&[0x00, 0x00, 0x80, 0x00]), expected);
926 assert_eq!(deserialize_v2_be(&[0x00, 0x80, 0x00, 0x00]), expected);
927 assert_eq!(deserialize_v2_le(&[0x00, 0x00, 0x80, 0x00]), expected);
928 }
929 #[test]
930 fn deserialize_f64() {
931 let expected = Ok(core::f64::MIN_POSITIVE);
932 assert_eq!(deserialize_v1_be(&[0, 0x10, 0, 0, 0, 0, 0, 0]), expected);
933 assert_eq!(deserialize_v1_le(&[0, 0, 0, 0, 0, 0, 0x10, 0]), expected);
934 assert_eq!(deserialize_v2_be(&[0, 0x10, 0, 0, 0, 0, 0, 0]), expected);
935 assert_eq!(deserialize_v2_le(&[0, 0, 0, 0, 0, 0, 0x10, 0]), expected);
936 }
937 #[test]
938 fn deserialize_char() {
939 let expected = Ok('A');
940 assert_eq!(deserialize_v1_be(&[0x41]), expected);
941 assert_eq!(deserialize_v1_le(&[0x41]), expected);
942 assert_eq!(deserialize_v2_be(&[0x41]), expected);
943 assert_eq!(deserialize_v2_le(&[0x41]), expected);
944 }
945
946 #[test]
947 fn deserialize_string() {
948 let expected = Ok("Hola");
949 assert_eq!(
950 deserialize_v1_be(&[
951 0, 0, 0, 5, b'H', b'o', b'l', b'a', 0x00, ]),
955 expected
956 );
957 assert_eq!(
958 deserialize_v1_le(&[
959 5, 0, 0, 0, b'H', b'o', b'l', b'a', 0x00, ]),
963 expected
964 );
965 assert_eq!(
966 deserialize_v2_be(&[
967 0, 0, 0, 5, b'H', b'o', b'l', b'a', 0x00, ]),
971 expected
972 );
973 assert_eq!(
974 deserialize_v2_le(&[
975 5, 0, 0, 0, b'H', b'o', b'l', b'a', 0x00, ]),
979 expected
980 );
981 }
982
983 #[test]
984 fn deserialize_bytes() {
985 let expected = Ok(&[1u8, 2, 3, 4, 5][..]);
986 assert_eq!(
987 deserialize_v1_be(&[
988 0, 0, 0, 5, 1, 2, 3, 4, 5 ]),
991 expected
992 );
993 assert_eq!(
994 deserialize_v1_le(&[
995 5, 0, 0, 0, 1, 2, 3, 4, 5 ]),
998 expected
999 );
1000 assert_eq!(
1001 deserialize_v2_be(&[
1002 0, 0, 0, 5, 1, 2, 3, 4, 5 ]),
1005 expected
1006 );
1007 assert_eq!(
1008 deserialize_v2_le(&[
1009 5, 0, 0, 0, 1, 2, 3, 4, 5 ]),
1012 expected
1013 );
1014 }
1015
1016 #[test]
1017 fn deserialize_byte_array() {
1018 let expected = Ok(&[1u8, 2, 3, 4, 5]);
1019 assert_eq!(deserialize_v1_be(&[1, 2, 3, 4, 5, 77]), expected);
1020 assert_eq!(deserialize_v1_le(&[1, 2, 3, 4, 5, 77]), expected);
1021 assert_eq!(deserialize_v2_be(&[1, 2, 3, 4, 5, 77]), expected);
1022 assert_eq!(deserialize_v2_le(&[1, 2, 3, 4, 5, 77]), expected);
1023 }
1024
1025 #[test]
1026 fn deserialize_sequence() {
1027 #[derive(Debug, PartialEq)]
1028 struct Atype(u8);
1029 impl<'de> XTypesDeserialize<'de> for Atype {
1030 fn deserialize(
1031 deserializer: impl XTypesDeserializer<'de>,
1032 ) -> Result<Self, XTypesError> {
1033 Ok(Atype(deserializer.deserialize_uint8()?))
1034 }
1035 }
1036
1037 let expected = Ok([Atype(1), Atype(2)]);
1038 assert_eq!(deserialize_v1_be(&[1, 2, 77]), expected);
1039 }
1040
1041 #[derive(Debug, PartialEq)]
1042 struct FinalType {
1044 field_u16: u16,
1045 field_u64: u64,
1046 }
1047 impl<'de> XTypesDeserialize<'de> for FinalType {
1048 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1049 let mut deserializer = deserializer.deserialize_final_struct()?;
1050 Ok(FinalType {
1051 field_u16: deserializer.deserialize_field("field_u16")?,
1052 field_u64: deserializer.deserialize_field("field_u64")?,
1053 })
1054 }
1055 }
1056
1057 #[test]
1058 fn deserialize_final_struct() {
1059 let expected = Ok(FinalType {
1060 field_u16: 7,
1061 field_u64: 9,
1062 });
1063 assert_eq!(
1065 deserialize_v1_be::<FinalType>(&[
1066 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ]),
1069 expected
1070 );
1071 assert_eq!(
1072 deserialize_v1_le::<FinalType>(&[
1073 7, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, ]),
1076 expected
1077 );
1078 assert_eq!(
1080 deserialize_v2_be::<FinalType>(&[
1081 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ]),
1084 expected
1085 );
1086 assert_eq!(
1087 deserialize_v2_le::<FinalType>(&[
1088 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, ]),
1091 expected
1092 );
1093 }
1094
1095 #[derive(Debug, PartialEq)]
1096 struct TypeWithStr<'a> {
1098 field_str: &'a str,
1099 field_u16: u16,
1100 field_slice: Bytes<'a>,
1101 }
1102 impl<'de> XTypesDeserialize<'de> for TypeWithStr<'de> {
1103 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1104 let mut deserializer = deserializer.deserialize_final_struct()?;
1105 Ok(Self {
1106 field_str: deserializer.deserialize_field("field_str")?,
1107 field_u16: deserializer.deserialize_field("field_u16")?,
1108 field_slice: deserializer.deserialize_field("field_slice")?,
1109 })
1110 }
1111 }
1112
1113 #[test]
1114 fn deserialize_struct_with_str() {
1115 let expected = Ok(TypeWithStr {
1116 field_str: "xt",
1117 field_u16: 9,
1118 field_slice: Bytes(&[10, 11]),
1119 });
1120 assert_eq!(
1122 deserialize_v1_be(&[
1123 0, 0, 0, 3, b'x', b't', 0, 0, 0, 9, 0, 0, 0, 0, 0, 2, 10, 11, ]),
1129 expected
1130 );
1131 assert_eq!(
1132 deserialize_v1_le(&[
1133 3, 0, 0, 0, b'x', b't', 0, 0, 9, 0, 0, 0, 2, 0, 0, 0, 10, 11, ]),
1139 expected
1140 );
1141 assert_eq!(
1143 deserialize_v2_be(&[
1144 0, 0, 0, 3, b'x', b't', 0, 0, 0, 9, 0, 0, 0, 0, 0, 2, 10, 11, ]),
1150 expected
1151 );
1152 assert_eq!(
1153 deserialize_v2_le(&[
1154 3, 0, 0, 0, b'x', b't', 0, 0, 9, 0, 0, 0, 2, 0, 0, 0, 10, 11, ]),
1160 expected
1161 );
1162 }
1163
1164 #[derive(Debug, PartialEq)]
1165 struct NestedFinalType {
1167 field_nested: FinalType,
1168 field_u8: u8,
1169 }
1170 impl<'de> XTypesDeserialize<'de> for NestedFinalType {
1171 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1172 let mut deserializer = deserializer.deserialize_final_struct()?;
1173 Ok(Self {
1174 field_nested: deserializer.deserialize_field("field_nested")?,
1175 field_u8: deserializer.deserialize_field("field_u8")?,
1176 })
1177 }
1178 }
1179
1180 #[derive(Debug, PartialEq)]
1181 struct FinalOptionalType {
1183 field: u8,
1184 optional_field: Option<u16>,
1185 }
1186
1187 impl<'de> XTypesDeserialize<'de> for FinalOptionalType {
1188 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1189 let mut d = deserializer.deserialize_final_struct()?;
1190 Ok(Self {
1191 field: d.deserialize_field("field")?,
1192 optional_field: d.deserialize_optional_field("optional_field")?,
1193 })
1194 }
1195 }
1196 #[test]
1197 fn deserialize_final_optional_struct() {
1198 let some = Ok(FinalOptionalType {
1199 field: 6,
1200 optional_field: Some(7),
1201 });
1202 assert_eq!(
1204 deserialize_v1_be(&[
1205 6, 0, 0, 0, 0, 0, 0, 2, 0, 7 ]),
1209 some
1210 );
1211 assert_eq!(
1212 deserialize_v1_le(&[
1213 6, 0, 0, 0, 0, 0, 2, 0, 7, 0 ]),
1217 some
1218 );
1219 assert_eq!(
1221 deserialize_v2_be(&[
1222 6, 1, 0, 7 ]),
1225 some
1226 );
1227 assert_eq!(
1228 deserialize_v2_le(&[
1229 6, 1, 7, 0 ]),
1232 some
1233 );
1234
1235 let none = Ok(FinalOptionalType {
1236 field: 6,
1237 optional_field: None,
1238 });
1239 assert_eq!(
1241 deserialize_v1_be(&[
1242 6, 0, 0, 0, 0, 0, 0, 0, ]),
1245 none
1246 );
1247 assert_eq!(
1248 deserialize_v1_le(&[
1249 6, 0, 0, 0, 0, 0, 0, 0, ]),
1252 none
1253 );
1254 assert_eq!(
1256 deserialize_v2_be(&[
1257 6, 0, ]),
1259 none
1260 );
1261 assert_eq!(
1262 deserialize_v2_le(&[
1263 6, 0, ]),
1265 none
1266 );
1267 }
1268
1269 #[test]
1270 fn deserialize_nested_final_struct() {
1271 let expected = Ok(NestedFinalType {
1272 field_nested: FinalType {
1273 field_u16: 7,
1274 field_u64: 9,
1275 },
1276 field_u8: 10,
1277 });
1278 assert_eq!(
1280 deserialize_v1_be::<NestedFinalType>(&[
1281 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, ]),
1285 expected
1286 );
1287 assert_eq!(
1288 deserialize_v1_le::<NestedFinalType>(&[
1289 7, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, ]),
1293 expected
1294 );
1295 assert_eq!(
1297 deserialize_v2_le::<NestedFinalType>(&[
1298 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, ]),
1302 expected
1303 );
1304 assert_eq!(
1305 deserialize_v2_be::<NestedFinalType>(&[
1306 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, ]),
1310 expected
1311 );
1312 }
1313
1314 #[derive(Debug, PartialEq)]
1315 struct AppendableType {
1317 value: u16,
1318 }
1319 impl<'de> XTypesDeserialize<'de> for AppendableType {
1320 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1321 let mut deserializer = deserializer.deserialize_appendable_struct()?;
1322 Ok(Self {
1323 value: deserializer.deserialize_field("value")?,
1324 })
1325 }
1326 }
1327
1328 #[test]
1329 fn deserialize_appendable_struct() {
1330 let expected = Ok(AppendableType { value: 7 });
1331 assert_eq!(deserialize_v1_be::<AppendableType>(&[0, 7]), expected);
1333 assert_eq!(deserialize_v1_le::<AppendableType>(&[7, 0]), expected);
1334 assert_eq!(
1336 deserialize_v2_be::<AppendableType>(&[
1337 0, 0, 0, 2, 0, 7 ]),
1340 expected
1341 );
1342 assert_eq!(
1343 deserialize_v2_le::<AppendableType>(&[
1344 2, 0, 0, 0, 7, 0 ]),
1347 expected
1348 );
1349 }
1350
1351 #[derive(Debug, PartialEq)]
1352 struct MutableType {
1354 key: u8,
1356 participant_key: u32,
1358 }
1359
1360 impl<'de> XTypesDeserialize<'de> for MutableType {
1361 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1362 let mut des = deserializer.deserialize_mutable_struct()?;
1363 Ok(Self {
1364 key: des.deserialize_field(0x005A, "key")?,
1365 participant_key: des.deserialize_field(0x0050, "participant_key")?,
1366 })
1367 }
1368 }
1369
1370 #[test]
1371 fn deserialize_mutable_struct() {
1372 let expected = Ok(MutableType {
1373 key: 7,
1374 participant_key: 8,
1375 });
1376 assert_eq!(
1378 deserialize_v1_be::<MutableType>(&[
1379 0x00, 0x05A, 0, 1, 7, 0, 0, 0, 0x00, 0x050, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, ]),
1385 expected
1386 );
1387 assert_eq!(
1388 deserialize_v1_le::<MutableType>(&[
1389 0x05A, 0x00, 1, 0, 7, 0, 0, 0, 0x050, 0x00, 4, 0, 8, 0, 0, 0, 0, 0, 0, 0, ]),
1395 expected
1396 );
1397 assert_eq!(
1399 deserialize_v2_be::<MutableType>(&[
1400 0x00, 0x05A, 0, 1, 7, 0, 0, 0, 0x00, 0x050, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, ]),
1406 expected
1407 );
1408 assert_eq!(
1409 deserialize_v2_le::<MutableType>(&[
1410 0x05A, 0x00, 1, 0, 7, 0, 0, 0, 0x050, 0x00, 4, 0, 8, 0, 0, 0, 0, 0, 0, 0, ]),
1416 expected
1417 );
1418 }
1419
1420 #[derive(Debug, PartialEq)]
1421 struct BasicTypes {
1422 f1: bool,
1423 f2: i8,
1424 f3: i16,
1425 f4: i32,
1426 f5: i64,
1427 f6: u8,
1428 f7: u16,
1429 f8: u32,
1430 f9: u64,
1431 f10: f32,
1432 f11: f64,
1433 f12: char,
1434 }
1435 impl<'de> XTypesDeserialize<'de> for BasicTypes {
1436 fn deserialize(deserializer: impl XTypesDeserializer<'de>) -> Result<Self, XTypesError> {
1437 let mut deserializer = deserializer.deserialize_final_struct()?;
1438 Ok(Self {
1439 f1: deserializer.deserialize_field("f1")?,
1440 f2: deserializer.deserialize_field("f2")?,
1441 f3: deserializer.deserialize_field("f3")?,
1442 f4: deserializer.deserialize_field("f4")?,
1443 f5: deserializer.deserialize_field("f5")?,
1444 f6: deserializer.deserialize_field("f6")?,
1445 f7: deserializer.deserialize_field("f7")?,
1446 f8: deserializer.deserialize_field("f8")?,
1447 f9: deserializer.deserialize_field("f9")?,
1448 f10: deserializer.deserialize_field("f10")?,
1449 f11: deserializer.deserialize_field("f11")?,
1450 f12: deserializer.deserialize_field("f12")?,
1451 })
1452 }
1453 }
1454
1455 #[test]
1456 fn deserialize_basic_types_struct() {
1457 let expected = Ok(BasicTypes {
1458 f1: true,
1459 f2: 2,
1460 f3: 3,
1461 f4: 4,
1462 f5: 5,
1463 f6: 6,
1464 f7: 7,
1465 f8: 8,
1466 f9: 9,
1467 f10: 1.0,
1468 f11: 1.0,
1469 f12: 'a',
1470 });
1471 assert_eq!(
1473 deserialize_v1_be(&[
1474 1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0x3F, 0x80, 0x00, 0x00, 0, 0, 0, 0, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, b'a', ]),
1482 expected
1483 );
1484 assert_eq!(
1485 deserialize_v1_le(&[
1486 1, 2, 3, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, 0x80, 0x3F, 0, 0, 0, 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, b'a', ]),
1494 expected
1495 );
1496 assert_eq!(
1498 deserialize_v2_be(&[
1499 1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, b'a', ]),
1512 expected
1513 );
1514 assert_eq!(
1515 deserialize_v2_le(&[
1516 1, 2, 3, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, b'a', ]),
1529 expected
1530 );
1531 }
1532}