fluvio_protocol/core/
decoder.rs

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
16// trait for encoding and decoding using Kafka Protocol
17pub trait Decoder: Sized + Default {
18    /// decode Fluvio compliant protocol values from buf
19    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 = []; // no values
462        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 = []; // no values
480        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]; // only one value
498
499        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]; // only one value
517
518        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]; // still need one more
634
635        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]; // still need one more
663
664        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]; // doesn't have right bytes
709
710        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]; // len and string doesn't match
718
719        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]; // len and string doesn't match
727
728        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]; // len and string doesn't match
737
738        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 = []; // no values
769
770        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]; // not bool
788
789        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        // array of strings with "test"
797        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]; // should only read first 3
849
850        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        // v1
883        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        // v2
890        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}