1use std::cmp::Ord;
2use std::collections::BTreeMap;
3use std::io::Error;
4use std::io::ErrorKind;
5use std::io::Read;
6use std::marker::PhantomData;
7use std::time::Duration;
8
9use bytes::Buf;
10use bytes::BufMut;
11use tracing::trace;
12
13use super::varint::varint_decode;
14use crate::Version;
15
16pub trait Decoder: Sized + Default {
18 fn decode_from<T>(src: &mut T, version: Version) -> Result<Self, Error>
20 where
21 T: Buf,
22 {
23 let mut decoder = Self::default();
24 decoder.decode(src, version)?;
25 Ok(decoder)
26 }
27
28 fn decode<T>(&mut self, src: &mut T, version: Version) -> Result<(), Error>
29 where
30 T: Buf;
31}
32
33pub trait DecoderVarInt {
34 fn decode_varint<T>(&mut self, src: &mut T) -> Result<(), Error>
35 where
36 T: Buf;
37}
38
39impl<M> Decoder for Vec<M>
40where
41 M: Decoder,
42{
43 fn decode<T>(&mut self, src: &mut T, version: Version) -> Result<(), Error>
44 where
45 T: Buf,
46 {
47 let mut len: i32 = 0;
48 len.decode(src, version)?;
49
50 trace!("decoding Vec len:{}", len);
51
52 if len < 1 {
53 trace!("negative length, skipping");
54 return Ok(());
55 }
56
57 decode_vec(len, self, src, version)?;
58
59 Ok(())
60 }
61}
62
63fn decode_vec<T, M>(len: i32, item: &mut Vec<M>, src: &mut T, version: Version) -> Result<(), Error>
64where
65 T: Buf,
66 M: Default + Decoder,
67{
68 for _ in 0..len {
69 let mut value = <M>::default();
70 value.decode(src, version)?;
71 item.push(value);
72 }
73
74 Ok(())
75}
76
77impl<M> Decoder for Option<M>
78where
79 M: Decoder,
80{
81 fn decode<T>(&mut self, src: &mut T, version: Version) -> Result<(), Error>
82 where
83 T: Buf,
84 {
85 let mut some = false;
86 some.decode(src, version)?;
87 if some {
88 let mut value = <M>::default();
89 value.decode(src, version)?;
90 *self = Some(value)
91 } else {
92 *self = None
93 }
94 Ok(())
95 }
96}
97
98impl<M> Decoder for PhantomData<M> {
99 fn decode<T>(&mut self, _src: &mut T, _version: Version) -> Result<(), Error>
100 where
101 T: Buf,
102 {
103 Ok(())
104 }
105}
106
107impl<K, V> Decoder for BTreeMap<K, V>
108where
109 K: Decoder + Ord,
110 V: Decoder,
111{
112 fn decode<T>(&mut self, src: &mut T, version: Version) -> Result<(), Error>
113 where
114 T: Buf,
115 {
116 let mut len: u16 = 0;
117 len.decode(src, version)?;
118
119 let mut map: BTreeMap<K, V> = BTreeMap::new();
120 for _i in 0..len {
121 let mut key = K::default();
122 key.decode(src, version)?;
123 let mut value = V::default();
124 value.decode(src, version)?;
125 map.insert(key, value);
126 }
127
128 *self = map;
129 Ok(())
130 }
131}
132
133impl Decoder for bool {
134 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
135 where
136 T: Buf,
137 {
138 if src.remaining() < 1 {
139 return Err(Error::new(
140 ErrorKind::UnexpectedEof,
141 "not enough buf for bool",
142 ));
143 }
144 let value = src.get_u8();
145
146 match value {
147 0 => *self = false,
148 1 => *self = true,
149 _ => {
150 return Err(Error::new(ErrorKind::InvalidData, "not valid bool value"));
151 }
152 };
153
154 Ok(())
155 }
156}
157
158impl Decoder for i8 {
159 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
160 where
161 T: Buf,
162 {
163 if src.remaining() < 1 {
164 return Err(Error::new(
165 ErrorKind::UnexpectedEof,
166 "not enough buf for i8",
167 ));
168 }
169 let value = src.get_i8();
170 *self = value;
171 Ok(())
172 }
173}
174
175impl Decoder for u8 {
176 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
177 where
178 T: Buf,
179 {
180 if src.remaining() < 1 {
181 return Err(Error::new(
182 ErrorKind::UnexpectedEof,
183 "not enough buf for u8",
184 ));
185 }
186 let value = src.get_u8();
187 *self = value;
188 Ok(())
189 }
190}
191
192impl Decoder for i16 {
193 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
194 where
195 T: Buf,
196 {
197 if src.remaining() < 2 {
198 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read i16"));
199 }
200 let value = src.get_i16();
201 *self = value;
202 Ok(())
203 }
204}
205
206impl Decoder for u16 {
207 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
208 where
209 T: Buf,
210 {
211 if src.remaining() < 2 {
212 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read u16"));
213 }
214 let value = src.get_u16();
215 *self = value;
216 Ok(())
217 }
218}
219
220impl Decoder for i32 {
221 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
222 where
223 T: Buf,
224 {
225 if src.remaining() < 4 {
226 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read i32"));
227 }
228 let value = src.get_i32();
229 trace!("i32: {:#x} => {}", &value, &value);
230 *self = value;
231 Ok(())
232 }
233}
234
235impl Decoder for u32 {
236 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
237 where
238 T: Buf,
239 {
240 if src.remaining() < 4 {
241 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read u32"));
242 }
243 let value = src.get_u32();
244 trace!("u32: {:#x} => {}", &value, &value);
245 *self = value;
246 Ok(())
247 }
248}
249
250impl Decoder for f32 {
251 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
252 where
253 T: Buf,
254 {
255 if src.remaining() < 4 {
256 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read f32"));
257 }
258 let value = src.get_f32();
259 *self = value;
260 Ok(())
261 }
262}
263
264impl Decoder for u64 {
265 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
266 where
267 T: Buf,
268 {
269 if src.remaining() < 8 {
270 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read u64"));
271 }
272 let value = src.get_u64();
273 trace!("u64: {:#x} => {}", &value, &value);
274 *self = value;
275 Ok(())
276 }
277}
278
279impl Decoder for i64 {
280 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
281 where
282 T: Buf,
283 {
284 if src.remaining() < 8 {
285 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read i64"));
286 }
287 let value = src.get_i64();
288 trace!("i64: {:#x} => {}", &value, &value);
289 *self = value;
290 Ok(())
291 }
292}
293
294impl Decoder for f64 {
295 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
296 where
297 T: Buf,
298 {
299 if src.remaining() < 8 {
300 return Err(Error::new(ErrorKind::UnexpectedEof, "can't read f64"));
301 }
302 let value = src.get_f64();
303 *self = value;
304 Ok(())
305 }
306}
307
308impl Decoder for Duration {
309 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
310 where
311 T: Buf,
312 {
313 if src.remaining() < 12 {
314 return Err(Error::new(
315 ErrorKind::UnexpectedEof,
316 "can't read u64+u32 as parts of Duration",
317 ));
318 }
319 let secs = src.get_u64();
320 trace!("u64: {:#x} => {}", &secs, &secs);
321 let nanos = src.get_u32();
322 trace!("u32: {:#x} => {}", &nanos, &nanos);
323
324 *self = Self::new(secs, nanos);
325 Ok(())
326 }
327}
328
329impl DecoderVarInt for i64 {
330 fn decode_varint<T>(&mut self, src: &mut T) -> Result<(), Error>
331 where
332 T: Buf,
333 {
334 let (value, _) = varint_decode(src)?;
335 *self = value;
336 Ok(())
337 }
338}
339
340fn decode_string<T>(len: i16, src: &mut T) -> Result<String, Error>
341where
342 T: Buf,
343{
344 let mut value = String::default();
345 let read_size = src.take(len as usize).reader().read_to_string(&mut value)?;
346
347 if read_size != len as usize {
348 return Err(Error::new(ErrorKind::UnexpectedEof, "not enough string"));
349 }
350 Ok(value)
351}
352
353impl Decoder for String {
354 fn decode<T>(&mut self, src: &mut T, _version: Version) -> Result<(), Error>
355 where
356 T: Buf,
357 {
358 if src.remaining() < 2 {
359 return Err(Error::new(
360 ErrorKind::UnexpectedEof,
361 "can't read string length",
362 ));
363 }
364 let len = src.get_i16();
365 if len <= 0 {
366 return Ok(());
367 }
368
369 let value = decode_string(len, src)?;
370 *self = value;
371 Ok(())
372 }
373}
374
375impl DecoderVarInt for Vec<u8> {
376 fn decode_varint<T>(&mut self, src: &mut T) -> Result<(), Error>
377 where
378 T: Buf,
379 {
380 let mut len: i64 = 0;
381 len.decode_varint(src)?;
382
383 if len < 1 {
384 return Ok(());
385 }
386
387 let mut buf = src.take(len as usize);
388 self.put(&mut buf);
389 if self.len() != len as usize {
390 return Err(Error::new(
391 ErrorKind::UnexpectedEof,
392 format!(
393 "varint: Vec<u8>>, expecting {} but received: {}",
394 len,
395 self.len()
396 ),
397 ));
398 }
399
400 Ok(())
401 }
402}
403
404fn decode_option_vec_u<T>(array: &mut Option<Vec<u8>>, src: &mut T, len: isize) -> Result<(), Error>
405where
406 T: Buf,
407{
408 if len < 0 {
409 *array = None;
410 return Ok(());
411 }
412
413 if len == 0 {
414 *array = Some(Vec::new());
415 return Ok(());
416 }
417
418 let mut buf = src.take(len as usize);
419 let mut value: Vec<u8> = Vec::new();
420 value.put(&mut buf);
421 if value.len() != len as usize {
422 return Err(Error::new(
423 ErrorKind::UnexpectedEof,
424 format!(
425 "Option<Vec<u8>>>, expecting {} but received: {}",
426 len,
427 value.len()
428 ),
429 ));
430 }
431
432 *array = Some(value);
433
434 Ok(())
435}
436
437impl DecoderVarInt for Option<Vec<u8>> {
438 fn decode_varint<T>(&mut self, src: &mut T) -> Result<(), Error>
439 where
440 T: Buf,
441 {
442 let mut len: i64 = 0;
443 len.decode_varint(src)?;
444
445 decode_option_vec_u(self, src, len as isize)
446 }
447}
448
449#[cfg(test)]
450mod test {
451
452 use crate::Decoder;
453 use crate::DecoderVarInt;
454 use crate::Version;
455 use bytes::Buf;
456 use std::io::Cursor;
457 use std::io::Error;
458
459 #[test]
460 fn test_decode_i18_not_enough() {
461 let data = []; let mut value: i8 = 0;
463 let result = value.decode(&mut Cursor::new(&data), 0);
464 assert!(result.is_err());
465 }
466
467 #[test]
468 fn test_decode_i8() {
469 let data = [0x12];
470
471 let mut value: i8 = 0;
472 let result = value.decode(&mut Cursor::new(&data), 0);
473 assert!(result.is_ok());
474 assert_eq!(value, 18);
475 }
476
477 #[test]
478 fn test_decode_u18_not_enough() {
479 let data = []; let mut value: u8 = 0;
481 let result = value.decode(&mut Cursor::new(&data), 0);
482 assert!(result.is_err());
483 }
484
485 #[test]
486 fn test_decode_u8() {
487 let data = [0x12];
488
489 let mut value: u8 = 0;
490 let result = value.decode(&mut Cursor::new(&data), 0);
491 assert!(result.is_ok());
492 assert_eq!(value, 18);
493 }
494
495 #[test]
496 fn test_decode_i16_not_enough() {
497 let data = [0x11]; let mut value: i16 = 0;
500 let result = value.decode(&mut Cursor::new(&data), 0);
501 assert!(result.is_err());
502 }
503
504 #[test]
505 fn test_decode_i16() {
506 let data = [0x00, 0x05];
507
508 let mut value: i16 = 0;
509 let result = value.decode(&mut Cursor::new(&data), 0);
510 assert!(result.is_ok());
511 assert_eq!(value, 5);
512 }
513
514 #[test]
515 fn test_decode_u16_not_enough() {
516 let data = [0x11]; let mut value: u16 = 0;
519 let result = value.decode(&mut Cursor::new(&data), 0);
520 assert!(result.is_err());
521 }
522
523 #[test]
524 fn test_decode_u16() {
525 let data = [0x00, 0x05];
526
527 let mut value: u16 = 0;
528 let result = value.decode(&mut Cursor::new(&data), 0);
529 assert!(result.is_ok());
530 assert_eq!(value, 5);
531 }
532
533 #[test]
534 fn test_decode_option_u16_none() {
535 let data = [0x00];
536
537 let mut value: Option<u16> = None;
538 let result = value.decode(&mut Cursor::new(&data), 0);
539 assert!(result.is_ok());
540 assert_eq!(value, None);
541 }
542
543 #[test]
544 fn test_decode_option_u16_val() {
545 let data = [0x01, 0x00, 0x10];
546
547 let mut value: Option<u16> = None;
548 let result = value.decode(&mut Cursor::new(&data), 0);
549 assert!(result.is_ok());
550 assert_eq!(value, Some(16));
551 }
552
553 #[test]
554 fn test_decode_u32_not_enough() {
555 let data = [0x11];
556
557 let mut value: u32 = 0;
558 let result = value.decode(&mut Cursor::new(&data), 0);
559 assert!(result.is_err());
560 }
561
562 #[test]
563 fn test_decode_u32() {
564 let data = [0x00, 0x00, 0x00, 0x05];
565
566 let mut value: u32 = 0;
567 let result = value.decode(&mut Cursor::new(&data), 0);
568 assert!(result.is_ok());
569 assert_eq!(value, 5);
570 }
571
572 #[test]
573 fn test_decode_option_u32_none() {
574 let data = [0x00];
575
576 let mut value: Option<u32> = None;
577 let result = value.decode(&mut Cursor::new(&data), 0);
578 assert!(result.is_ok());
579 assert_eq!(value, None);
580 }
581
582 #[test]
583 fn test_decode_option_u32_val() {
584 let data = [0x01, 0x00, 0x00, 0x01, 0x10];
585
586 let mut value: Option<u32> = None;
587 let result = value.decode(&mut Cursor::new(&data), 0);
588 assert!(result.is_ok());
589 assert_eq!(value, Some(272));
590 }
591
592 #[test]
593 fn test_decode_u64_not_enough() {
594 let data = [0x11];
595
596 let mut value: u64 = 0;
597 let result = value.decode(&mut Cursor::new(&data), 0);
598 assert!(result.is_err());
599 }
600
601 #[test]
602 fn test_decode_u64() {
603 let data = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05];
604
605 let mut value: u64 = 0;
606 let result = value.decode(&mut Cursor::new(&data), 0);
607 assert!(result.is_ok());
608 assert_eq!(value, 5);
609 }
610
611 #[test]
612 fn test_decode_option_u64_none() {
613 let data = [0x00];
614
615 let mut value: Option<u64> = None;
616 let result = value.decode(&mut Cursor::new(&data), 0);
617 assert!(result.is_ok());
618 assert_eq!(value, None);
619 }
620
621 #[test]
622 fn test_decode_option_u64_val() {
623 let data = [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05];
624
625 let mut value: Option<u64> = None;
626 let result = value.decode(&mut Cursor::new(&data), 0);
627 assert!(result.is_ok());
628 assert_eq!(value, Some(5));
629 }
630
631 #[test]
632 fn test_decode_i32_not_enough() {
633 let data = [0x11, 0x11, 0x00]; let mut value: i32 = 0;
636 let result = value.decode(&mut Cursor::new(&data), 0);
637 assert!(result.is_err());
638 }
639
640 #[test]
641 fn test_decode_i32() {
642 let data = [0x00, 0x00, 0x00, 0x10];
643
644 let mut value: i32 = 0;
645 let result = value.decode(&mut Cursor::new(&data), 0);
646 assert!(result.is_ok());
647 assert_eq!(value, 16);
648 }
649
650 #[test]
651 fn test_decode_i32_2() {
652 let data = [0x00, 0x00, 0x00, 0x01];
653
654 let mut value: i32 = 0;
655 let result = value.decode(&mut Cursor::new(&data), 0);
656 assert!(result.is_ok());
657 assert_eq!(value, 1);
658 }
659
660 #[test]
661 fn test_decode_i64_not_enough() {
662 let data = [0x11, 0x11, 0x00]; let mut value: i64 = 0;
665 let result = value.decode(&mut Cursor::new(&data), 0);
666 assert!(result.is_err());
667 }
668
669 #[test]
670 fn test_decode_i64() {
671 let data = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20];
672
673 let mut value: i64 = 0;
674 let result = value.decode(&mut Cursor::new(&data), 0);
675 assert!(result.is_ok());
676 assert_eq!(value, 32);
677 }
678
679 #[test]
680 fn test_f32_encode_and_decode() {
681 use crate::Encoder;
682 let f_in: f32 = 103.19105;
683 let mut out: Vec<u8> = vec![];
684 f_in.encode(&mut out, 0).expect("failed to encode");
685 assert_eq!(out.len(), 4);
686 let mut f_out: f32 = 0.0;
687 f_out
688 .decode(&mut Cursor::new(&out), 0)
689 .expect("failed to decode");
690 assert_eq!(f_in, f_out);
691 }
692
693 #[test]
694 fn test_f64_encode_and_decode() {
695 use crate::Encoder;
696 let f_in: f64 = 123.456789101112;
697 let mut out: Vec<u8> = vec![];
698 f_in.encode(&mut out, 0).expect("failed to encode");
699 assert_eq!(out.len(), 8);
700 let mut f_out: f64 = 0.0;
701 f_out
702 .decode(&mut Cursor::new(&out), 0)
703 .expect("failed to decode");
704 assert_eq!(f_in, f_out);
705 }
706 #[test]
707 fn test_decode_invalid_string_not_len() {
708 let data = [0x11]; let mut value = String::from("");
711 let result = value.decode(&mut Cursor::new(&data), 0);
712 assert!(result.is_err());
713 }
714
715 #[test]
716 fn test_decode_invalid_string() {
717 let data = [0x00, 0x0a, 0x63]; let mut value = String::from("");
720 let result = value.decode(&mut Cursor::new(&data), 0);
721 assert!(result.is_err());
722 }
723
724 #[test]
725 fn test_decode_null_option_string() {
726 let data = [0x00]; let mut value: Option<String> = Some(String::from("test"));
729 let result = value.decode(&mut Cursor::new(&data), 0);
730 assert!(result.is_ok());
731 assert!(value.is_none());
732 }
733
734 #[test]
735 fn test_decode_some_option_string() {
736 let data = [0x01, 0x00, 0x02, 0x77, 0x6f]; let mut value: Option<String> = None;
739 let result = value.decode(&mut Cursor::new(&data), 0);
740 assert!(result.is_ok());
741 assert!(value.is_some());
742 assert_eq!(value.unwrap(), "wo");
743 }
744
745 #[test]
746 fn test_decode_string_existing_value() {
747 let src = [0x0, 0x7, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30];
748 let mut decode_target = "123".to_string();
749 let result = decode_target.decode(&mut Cursor::new(&src), 0);
750 assert!(result.is_ok());
751 assert_eq!(decode_target, "0.0.0.0".to_string());
752 }
753
754 #[test]
755 fn test_decode_string() {
756 let data = [
757 0x00, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x2d, 0x31,
758 ];
759
760 let mut value = String::from("");
761 let result = value.decode(&mut Cursor::new(&data), 0);
762 assert!(result.is_ok());
763 assert_eq!(value, "consumer-1");
764 }
765
766 #[test]
767 fn test_decode_bool_not_enough() {
768 let data = []; let mut value: bool = false;
771 let result = value.decode(&mut Cursor::new(&data), 0);
772 assert!(result.is_err());
773 }
774
775 #[test]
776 fn test_decode_bool() {
777 let data = [0x1];
778
779 let mut value: bool = false;
780 let result = value.decode(&mut Cursor::new(&data), 0);
781 assert!(result.is_ok());
782 assert!(value);
783 }
784
785 #[test]
786 fn test_decode_bool_invalid_value() {
787 let data = [0x23]; let mut value: bool = false;
790 let result = value.decode(&mut Cursor::new(&data), 0);
791 assert!(result.is_err());
792 }
793
794 #[test]
795 fn test_decode_valid_string_vectors() {
796 let data = [0, 0, 0, 0x01, 0x00, 0x04, 0x74, 0x65, 0x73, 0x74];
798
799 let mut values: Vec<String> = Vec::new();
800 let result = values.decode(&mut Cursor::new(&data), 0);
801 assert!(result.is_ok());
802 assert_eq!(values.len(), 1);
803 let first_str = &values[0];
804 assert_eq!(first_str, "test");
805 }
806
807 #[test]
808 fn test_decode_varint_trait() {
809 let data = [0x7e];
810
811 let mut value: i64 = 0;
812 let result = value.decode_varint(&mut Cursor::new(&data));
813 assert!(result.is_ok());
814 assert_eq!(value, 63);
815 }
816
817 #[test]
818 fn test_decode_varint_vec8() {
819 let data = [0x06, 0x64, 0x6f, 0x67];
820
821 let mut value: Vec<u8> = Vec::new();
822 let result = value.decode_varint(&mut Cursor::new(&data));
823 assert!(result.is_ok());
824 assert_eq!(value.len(), 3);
825 assert_eq!(value[0], 0x64);
826 }
827
828 #[test]
829 fn test_vec8_encode_and_decode() {
830 use crate::Encoder;
831 let in_vec: Vec<u8> = vec![1, 2, 3];
832 let mut out: Vec<u8> = vec![];
833 let ret = in_vec.encode(&mut out, 0);
834 assert!(ret.is_ok());
835 }
836
837 #[test]
838 fn test_decode_varint_vec8_fail() {
839 let data = [0x06, 0x64, 0x6f];
840
841 let mut value: Vec<u8> = Vec::new();
842 let result = value.decode_varint(&mut Cursor::new(&data));
843 assert!(result.is_err());
844 }
845
846 #[test]
847 fn test_varint_decode_array_opton_vec8_simple_array() {
848 let data = [0x06, 0x64, 0x6f, 0x67, 0x00]; let mut value: Option<Vec<u8>> = Some(Vec::new());
851 let result = value.decode_varint(&mut Cursor::new(&data));
852 assert!(result.is_ok());
853 assert!(value.is_some());
854 let array = value.unwrap();
855 assert_eq!(array.len(), 3);
856 assert_eq!(array[0], 0x64);
857 }
858
859 #[derive(Default)]
860 struct TestRecord {
861 value: i8,
862 value2: i8,
863 }
864
865 impl Decoder for TestRecord {
866 fn decode<T>(&mut self, src: &mut T, version: Version) -> Result<(), Error>
867 where
868 T: Buf,
869 {
870 self.value.decode(src, 0)?;
871 if version > 1 {
872 self.value2.decode(src, 0)?;
873 }
874 Ok(())
875 }
876 }
877
878 #[test]
879 fn test_decoding_struct() {
880 let data = [0x06];
881
882 let result = TestRecord::decode_from(&mut Cursor::new(&data), 0);
884 assert!(result.is_ok());
885 let record = result.unwrap();
886 assert_eq!(record.value, 6);
887 assert_eq!(record.value2, 0);
888
889 let data2 = [0x06, 0x09];
891 let record2 = TestRecord::decode_from(&mut Cursor::new(&data2), 2).expect("decode");
892 assert_eq!(record2.value, 6);
893 assert_eq!(record2.value2, 9);
894 }
895}