justcode_core/
encode.rs

1//! Encoding trait and implementations.
2
3use crate::reader::Reader;
4use crate::varint::{decode_length, encode_length};
5use crate::writer::Writer;
6use crate::Result;
7
8/// Trait for types that can be encoded to binary format.
9pub trait Encode {
10    /// Encode this value into the writer.
11    fn encode(&self, writer: &mut Writer) -> Result<()>;
12}
13
14/// Trait for types that can be decoded from binary format.
15pub trait Decode: Sized {
16    /// Decode a value from the reader.
17    fn decode(reader: &mut Reader) -> Result<Self>;
18}
19
20// Implementations for primitive types
21
22impl Encode for u8 {
23    fn encode(&self, writer: &mut Writer) -> Result<()> {
24        writer.write_u8(*self)
25    }
26}
27
28impl Decode for u8 {
29    fn decode(reader: &mut Reader) -> Result<Self> {
30        reader.read_u8()
31    }
32}
33
34impl Encode for u16 {
35    fn encode(&self, writer: &mut Writer) -> Result<()> {
36        writer.write_u16(*self)
37    }
38}
39
40impl Decode for u16 {
41    fn decode(reader: &mut Reader) -> Result<Self> {
42        reader.read_u16()
43    }
44}
45
46impl Encode for u32 {
47    fn encode(&self, writer: &mut Writer) -> Result<()> {
48        writer.write_u32(*self)
49    }
50}
51
52impl Decode for u32 {
53    fn decode(reader: &mut Reader) -> Result<Self> {
54        reader.read_u32()
55    }
56}
57
58impl Encode for u64 {
59    fn encode(&self, writer: &mut Writer) -> Result<()> {
60        writer.write_u64(*self)
61    }
62}
63
64impl Decode for u64 {
65    fn decode(reader: &mut Reader) -> Result<Self> {
66        reader.read_u64()
67    }
68}
69
70impl Encode for usize {
71    fn encode(&self, writer: &mut Writer) -> Result<()> {
72        writer.write_u64(*self as u64)
73    }
74}
75
76impl Decode for usize {
77    fn decode(reader: &mut Reader) -> Result<Self> {
78        Ok(reader.read_u64()? as usize)
79    }
80}
81
82impl Encode for i8 {
83    fn encode(&self, writer: &mut Writer) -> Result<()> {
84        writer.write_i8(*self)
85    }
86}
87
88impl Decode for i8 {
89    fn decode(reader: &mut Reader) -> Result<Self> {
90        reader.read_i8()
91    }
92}
93
94impl Encode for i16 {
95    fn encode(&self, writer: &mut Writer) -> Result<()> {
96        writer.write_i16(*self)
97    }
98}
99
100impl Decode for i16 {
101    fn decode(reader: &mut Reader) -> Result<Self> {
102        reader.read_i16()
103    }
104}
105
106impl Encode for i32 {
107    fn encode(&self, writer: &mut Writer) -> Result<()> {
108        writer.write_i32(*self)
109    }
110}
111
112impl Decode for i32 {
113    fn decode(reader: &mut Reader) -> Result<Self> {
114        reader.read_i32()
115    }
116}
117
118impl Encode for i64 {
119    fn encode(&self, writer: &mut Writer) -> Result<()> {
120        writer.write_i64(*self)
121    }
122}
123
124impl Decode for i64 {
125    fn decode(reader: &mut Reader) -> Result<Self> {
126        reader.read_i64()
127    }
128}
129
130impl Encode for f32 {
131    fn encode(&self, writer: &mut Writer) -> Result<()> {
132        writer.write_f32(*self)
133    }
134}
135
136impl Decode for f32 {
137    fn decode(reader: &mut Reader) -> Result<Self> {
138        reader.read_f32()
139    }
140}
141
142impl Encode for f64 {
143    fn encode(&self, writer: &mut Writer) -> Result<()> {
144        writer.write_f64(*self)
145    }
146}
147
148impl Decode for f64 {
149    fn decode(reader: &mut Reader) -> Result<Self> {
150        reader.read_f64()
151    }
152}
153
154impl Encode for bool {
155    fn encode(&self, writer: &mut Writer) -> Result<()> {
156        writer.write_bool(*self)
157    }
158}
159
160impl Decode for bool {
161    fn decode(reader: &mut Reader) -> Result<Self> {
162        reader.read_bool()
163    }
164}
165
166impl Encode for char {
167    fn encode(&self, writer: &mut Writer) -> Result<()> {
168        (*self as u32).encode(writer)
169    }
170}
171
172impl Decode for char {
173    fn decode(reader: &mut Reader) -> Result<Self> {
174        let code = u32::decode(reader)?;
175        char::from_u32(code).ok_or_else(|| crate::error::JustcodeError::custom("invalid char"))
176    }
177}
178
179// Implementations for collections
180
181#[cfg(feature = "std")]
182impl<T: Encode> Encode for Vec<T> {
183    fn encode(&self, writer: &mut Writer) -> Result<()> {
184        let config = writer.config();
185        encode_length(writer, self.len(), config)?;
186        for item in self {
187            item.encode(writer)?;
188        }
189        Ok(())
190    }
191}
192
193#[cfg(feature = "std")]
194impl<T: Decode> Decode for Vec<T> {
195    fn decode(reader: &mut Reader) -> Result<Self> {
196        let config = reader.config();
197        let len = decode_length(reader, config)?;
198        let mut vec = Vec::with_capacity(len.min(1024)); // Cap initial capacity
199        for _ in 0..len {
200            vec.push(T::decode(reader)?);
201        }
202        Ok(vec)
203    }
204}
205
206#[cfg(not(feature = "std"))]
207use alloc::vec::Vec;
208
209#[cfg(not(feature = "std"))]
210impl<T: Encode> Encode for Vec<T> {
211    fn encode(&self, writer: &mut Writer) -> Result<()> {
212        let config = writer.config();
213        encode_length(writer, self.len(), config)?;
214        for item in self {
215            item.encode(writer)?;
216        }
217        Ok(())
218    }
219}
220
221#[cfg(not(feature = "std"))]
222impl<T: Decode> Decode for Vec<T> {
223    fn decode(reader: &mut Reader) -> Result<Self> {
224        let config = reader.config();
225        let len = decode_length(reader, config)?;
226        let mut vec = Vec::new();
227        for _ in 0..len {
228            vec.push(T::decode(reader)?);
229        }
230        Ok(vec)
231    }
232}
233
234impl<T: Encode> Encode for Option<T> {
235    fn encode(&self, writer: &mut Writer) -> Result<()> {
236        match self {
237            Some(value) => {
238                writer.write_bool(true)?;
239                value.encode(writer)?;
240            }
241            None => {
242                writer.write_bool(false)?;
243            }
244        }
245        Ok(())
246    }
247}
248
249impl<T: Decode> Decode for Option<T> {
250    fn decode(reader: &mut Reader) -> Result<Self> {
251        if reader.read_bool()? {
252            Ok(Some(T::decode(reader)?))
253        } else {
254            Ok(None)
255        }
256    }
257}
258
259#[cfg(feature = "std")]
260impl Encode for String {
261    fn encode(&self, writer: &mut Writer) -> Result<()> {
262        self.as_bytes().to_vec().encode(writer)
263    }
264}
265
266#[cfg(feature = "std")]
267impl Decode for String {
268    fn decode(reader: &mut Reader) -> Result<Self> {
269        let bytes = Vec::<u8>::decode(reader)?;
270        String::from_utf8(bytes)
271            .map_err(|e| crate::error::JustcodeError::custom(format!("invalid UTF-8: {}", e)))
272    }
273}
274
275#[cfg(feature = "std")]
276impl Encode for &str {
277    fn encode(&self, writer: &mut Writer) -> Result<()> {
278        self.as_bytes().to_vec().encode(writer)
279    }
280}
281
282// Implement Encode for &[u8] by converting to Vec
283impl Encode for &[u8] {
284    fn encode(&self, writer: &mut Writer) -> Result<()> {
285        self.to_vec().encode(writer)
286    }
287}
288
289// Tuple implementations
290
291impl<T1: Encode> Encode for (T1,) {
292    fn encode(&self, writer: &mut Writer) -> Result<()> {
293        self.0.encode(writer)
294    }
295}
296
297impl<T1: Decode> Decode for (T1,) {
298    fn decode(reader: &mut Reader) -> Result<Self> {
299        Ok((T1::decode(reader)?,))
300    }
301}
302
303impl<T1: Encode, T2: Encode> Encode for (T1, T2) {
304    fn encode(&self, writer: &mut Writer) -> Result<()> {
305        self.0.encode(writer)?;
306        self.1.encode(writer)
307    }
308}
309
310impl<T1: Decode, T2: Decode> Decode for (T1, T2) {
311    fn decode(reader: &mut Reader) -> Result<Self> {
312        Ok((T1::decode(reader)?, T2::decode(reader)?))
313    }
314}
315
316impl<T1: Encode, T2: Encode, T3: Encode> Encode for (T1, T2, T3) {
317    fn encode(&self, writer: &mut Writer) -> Result<()> {
318        self.0.encode(writer)?;
319        self.1.encode(writer)?;
320        self.2.encode(writer)
321    }
322}
323
324impl<T1: Decode, T2: Decode, T3: Decode> Decode for (T1, T2, T3) {
325    fn decode(reader: &mut Reader) -> Result<Self> {
326        Ok((
327            T1::decode(reader)?,
328            T2::decode(reader)?,
329            T3::decode(reader)?,
330        ))
331    }
332}
333
334impl<T1: Encode, T2: Encode, T3: Encode, T4: Encode> Encode for (T1, T2, T3, T4) {
335    fn encode(&self, writer: &mut Writer) -> Result<()> {
336        self.0.encode(writer)?;
337        self.1.encode(writer)?;
338        self.2.encode(writer)?;
339        self.3.encode(writer)
340    }
341}
342
343impl<T1: Decode, T2: Decode, T3: Decode, T4: Decode> Decode for (T1, T2, T3, T4) {
344    fn decode(reader: &mut Reader) -> Result<Self> {
345        Ok((
346            T1::decode(reader)?,
347            T2::decode(reader)?,
348            T3::decode(reader)?,
349            T4::decode(reader)?,
350        ))
351    }
352}
353
354// Array implementations (up to 32 elements)
355
356macro_rules! impl_array {
357    ($n:expr) => {
358        impl<T: Encode> Encode for [T; $n] {
359            fn encode(&self, writer: &mut Writer) -> Result<()> {
360                for item in self {
361                    item.encode(writer)?;
362                }
363                Ok(())
364            }
365        }
366
367        impl<T: Decode + Copy + Default> Decode for [T; $n] {
368            fn decode(reader: &mut Reader) -> Result<Self> {
369                let mut arr = [T::default(); $n];
370                for item in &mut arr {
371                    *item = T::decode(reader)?;
372                }
373                Ok(arr)
374            }
375        }
376    };
377}
378
379impl_array!(0);
380impl_array!(1);
381impl_array!(2);
382impl_array!(3);
383impl_array!(4);
384impl_array!(5);
385impl_array!(6);
386impl_array!(7);
387impl_array!(8);
388impl_array!(9);
389impl_array!(10);
390impl_array!(11);
391impl_array!(12);
392impl_array!(13);
393impl_array!(14);
394impl_array!(15);
395impl_array!(16);
396impl_array!(17);
397impl_array!(18);
398impl_array!(19);
399impl_array!(20);
400impl_array!(21);
401impl_array!(22);
402impl_array!(23);
403impl_array!(24);
404impl_array!(25);
405impl_array!(26);
406impl_array!(27);
407impl_array!(28);
408impl_array!(29);
409impl_array!(30);
410impl_array!(31);
411impl_array!(32);
412
413// Enum encoding support
414// Enums are encoded as: variant_index (u32 or varint) + variant data
415// The variant index is encoded based on config.variable_int_encoding
416
417impl Encode for () {
418    fn encode(&self, _writer: &mut Writer) -> Result<()> {
419        Ok(())
420    }
421}
422
423impl Decode for () {
424    fn decode(_reader: &mut Reader) -> Result<Self> {
425        Ok(())
426    }
427}
428
429#[cfg(test)]
430mod tests {
431    use super::*;
432    use crate::config;
433
434    #[test]
435    fn test_encode_decode_all_primitives() {
436        let config = config::standard();
437        
438        // Test u8
439        let value = 42u8;
440        let encoded = crate::encode_to_vec(&value, config).unwrap();
441        let (decoded, _): (u8, usize) = crate::decode_from_slice(&encoded, config).unwrap();
442        assert_eq!(value, decoded);
443
444        // Test u16
445        let value = 1000u16;
446        let encoded = crate::encode_to_vec(&value, config).unwrap();
447        let (decoded, _): (u16, usize) = crate::decode_from_slice(&encoded, config).unwrap();
448        assert_eq!(value, decoded);
449
450        // Test u32
451        let value = 100000u32;
452        let encoded = crate::encode_to_vec(&value, config).unwrap();
453        let (decoded, _): (u32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
454        assert_eq!(value, decoded);
455
456        // Test u64
457        let value = 1000000000u64;
458        let encoded = crate::encode_to_vec(&value, config).unwrap();
459        let (decoded, _): (u64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
460        assert_eq!(value, decoded);
461
462        // Test usize
463        let value = 42usize;
464        let encoded = crate::encode_to_vec(&value, config).unwrap();
465        let (decoded, _): (usize, usize) = crate::decode_from_slice(&encoded, config).unwrap();
466        assert_eq!(value, decoded);
467
468        // Test i8
469        let value = -42i8;
470        let encoded = crate::encode_to_vec(&value, config).unwrap();
471        let (decoded, _): (i8, usize) = crate::decode_from_slice(&encoded, config).unwrap();
472        assert_eq!(value, decoded);
473
474        // Test i16
475        let value = -1000i16;
476        let encoded = crate::encode_to_vec(&value, config).unwrap();
477        let (decoded, _): (i16, usize) = crate::decode_from_slice(&encoded, config).unwrap();
478        assert_eq!(value, decoded);
479
480        // Test i32
481        let value = -100000i32;
482        let encoded = crate::encode_to_vec(&value, config).unwrap();
483        let (decoded, _): (i32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
484        assert_eq!(value, decoded);
485
486        // Test i64
487        let value = -1000000000i64;
488        let encoded = crate::encode_to_vec(&value, config).unwrap();
489        let (decoded, _): (i64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
490        assert_eq!(value, decoded);
491
492        // Test f32
493        let value = 3.14f32;
494        let encoded = crate::encode_to_vec(&value, config).unwrap();
495        let (decoded, _): (f32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
496        assert!((value - decoded).abs() < 0.001);
497
498        // Test f64
499        let value = 2.718f64;
500        let encoded = crate::encode_to_vec(&value, config).unwrap();
501        let (decoded, _): (f64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
502        assert!((value - decoded).abs() < 0.0001);
503
504        // Test bool
505        let value = true;
506        let encoded = crate::encode_to_vec(&value, config).unwrap();
507        let (decoded, _): (bool, usize) = crate::decode_from_slice(&encoded, config).unwrap();
508        assert_eq!(value, decoded);
509
510        let value = false;
511        let encoded = crate::encode_to_vec(&value, config).unwrap();
512        let (decoded, _): (bool, usize) = crate::decode_from_slice(&encoded, config).unwrap();
513        assert_eq!(value, decoded);
514
515        // Test char
516        let value = 'A';
517        let encoded = crate::encode_to_vec(&value, config).unwrap();
518        let (decoded, _): (char, usize) = crate::decode_from_slice(&encoded, config).unwrap();
519        assert_eq!(value, decoded);
520
521        let value = '🦊';
522        let encoded = crate::encode_to_vec(&value, config).unwrap();
523        let (decoded, _): (char, usize) = crate::decode_from_slice(&encoded, config).unwrap();
524        assert_eq!(value, decoded);
525    }
526
527    #[test]
528    fn test_encode_decode_primitives() {
529        let config = config::standard();
530        let test_cases: Vec<Box<dyn Fn(&mut Writer) -> Result<()>>> = vec![
531            Box::new(|w| 42u8.encode(w)),
532            Box::new(|w| 1000u16.encode(w)),
533            Box::new(|w| 100000u32.encode(w)),
534            Box::new(|w| 1000000000u64.encode(w)),
535            Box::new(|w| true.encode(w)),
536            Box::new(|w| 3.14f32.encode(w)),
537        ];
538
539        for encode_fn in test_cases {
540            let mut writer = Writer::new(config);
541            encode_fn(&mut writer).unwrap();
542            let bytes = writer.into_bytes();
543            assert!(!bytes.is_empty());
544        }
545    }
546
547    #[test]
548    fn test_encode_decode_vec() {
549        let config = config::standard();
550        let value = vec![1u32, 2, 3, 4, 5];
551        let encoded = crate::encode_to_vec(&value, config).unwrap();
552        let (decoded, _): (Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
553        assert_eq!(value, decoded);
554    }
555
556    #[test]
557    fn test_encode_decode_empty_vec() {
558        let config = config::standard();
559        let value: Vec<u32> = vec![];
560        let encoded = crate::encode_to_vec(&value, config).unwrap();
561        let (decoded, _): (Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
562        assert_eq!(value, decoded);
563    }
564
565    #[test]
566    fn test_encode_decode_large_vec() {
567        let config = config::standard();
568        let value: Vec<u8> = (0u8..255).chain(0u8..255).chain(0u8..255).chain(0u8..235).collect();
569        let encoded = crate::encode_to_vec(&value, config).unwrap();
570        let (decoded, _): (Vec<u8>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
571        assert_eq!(value, decoded);
572    }
573
574    #[test]
575    fn test_encode_decode_option() {
576        let config = config::standard();
577        let value = Some(42u32);
578        let encoded = crate::encode_to_vec(&value, config).unwrap();
579        let (decoded, _): (Option<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
580        assert_eq!(value, decoded);
581
582        let value = None::<u32>;
583        let encoded = crate::encode_to_vec(&value, config).unwrap();
584        let (decoded, _): (Option<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
585        assert_eq!(value, decoded);
586    }
587
588    #[test]
589    fn test_encode_option_none_directly() {
590        let config = config::standard();
591        let mut writer = Writer::new(config);
592        let none: Option<u32> = None;
593        none.encode(&mut writer).unwrap();
594        let bytes = writer.into_bytes();
595        // Should be just a single byte (false)
596        assert_eq!(bytes.len(), 1);
597        assert_eq!(bytes[0], 0);
598    }
599
600    #[test]
601    fn test_encode_option_some_directly() {
602        let config = config::standard();
603        let mut writer = Writer::new(config);
604        let some: Option<u32> = Some(42);
605        some.encode(&mut writer).unwrap();
606        let bytes = writer.into_bytes();
607        // Should be 1 byte (true) + 4 bytes (u32)
608        assert_eq!(bytes.len(), 5);
609        assert_eq!(bytes[0], 1);
610    }
611
612    #[test]
613    fn test_encode_decode_string() {
614        let config = config::standard();
615        let value = "hello, world!".to_string();
616        let encoded = crate::encode_to_vec(&value, config).unwrap();
617        let (decoded, _): (String, usize) = crate::decode_from_slice(&encoded, config).unwrap();
618        assert_eq!(value, decoded);
619    }
620
621    #[test]
622    fn test_encode_decode_str() {
623        let config = config::standard();
624        let value = "hello, world!";
625        let encoded = crate::encode_to_vec(&value, config).unwrap();
626        let (decoded, _): (String, usize) = crate::decode_from_slice(&encoded, config).unwrap();
627        assert_eq!(value, decoded);
628    }
629
630    #[test]
631    fn test_encode_decode_bytes() {
632        let config = config::standard();
633        let value: &[u8] = &[1, 2, 3, 4, 5];
634        let encoded = crate::encode_to_vec(&value, config).unwrap();
635        let (decoded, _): (Vec<u8>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
636        assert_eq!(value, decoded);
637    }
638
639    #[test]
640    fn test_encode_decode_tuple() {
641        let config = config::standard();
642        let value = (42u32, "hello".to_string(), true);
643        let encoded = crate::encode_to_vec(&value, config).unwrap();
644        let (decoded, _): ((u32, String, bool), usize) =
645            crate::decode_from_slice(&encoded, config).unwrap();
646        assert_eq!(value, decoded);
647    }
648
649    #[test]
650    fn test_encode_decode_tuple1() {
651        let config = config::standard();
652        let value = (42u32,);
653        let encoded = crate::encode_to_vec(&value, config).unwrap();
654        let (decoded, _): ((u32,), usize) = crate::decode_from_slice(&encoded, config).unwrap();
655        assert_eq!(value, decoded);
656    }
657
658    #[test]
659    fn test_encode_decode_tuple2() {
660        let config = config::standard();
661        let value = (42u32, "hello".to_string());
662        let encoded = crate::encode_to_vec(&value, config).unwrap();
663        let (decoded, _): ((u32, String), usize) = crate::decode_from_slice(&encoded, config).unwrap();
664        assert_eq!(value, decoded);
665    }
666
667    #[test]
668    fn test_encode_decode_tuple4() {
669        let config = config::standard();
670        let value = (1u32, 2u32, 3u32, 4u32);
671        let encoded = crate::encode_to_vec(&value, config).unwrap();
672        let (decoded, _): ((u32, u32, u32, u32), usize) = crate::decode_from_slice(&encoded, config).unwrap();
673        assert_eq!(value, decoded);
674    }
675
676    #[test]
677    fn test_encode_decode_unit() {
678        let config = config::standard();
679        let value = ();
680        let encoded = crate::encode_to_vec(&value, config).unwrap();
681        let (decoded, _): ((), usize) = crate::decode_from_slice(&encoded, config).unwrap();
682        assert_eq!(value, decoded);
683    }
684
685    #[test]
686    fn test_encode_decode_arrays() {
687        let config = config::standard();
688        
689        // Test array of size 0
690        let value: [u8; 0] = [];
691        let encoded = crate::encode_to_vec(&value, config).unwrap();
692        let (decoded, _): ([u8; 0], usize) = crate::decode_from_slice(&encoded, config).unwrap();
693        assert_eq!(value, decoded);
694
695        // Test array of size 1
696        let value = [42u8];
697        let encoded = crate::encode_to_vec(&value, config).unwrap();
698        let (decoded, _): ([u8; 1], usize) = crate::decode_from_slice(&encoded, config).unwrap();
699        assert_eq!(value, decoded);
700
701        // Test array of size 5
702        let value = [1u32, 2, 3, 4, 5];
703        let encoded = crate::encode_to_vec(&value, config).unwrap();
704        let (decoded, _): ([u32; 5], usize) = crate::decode_from_slice(&encoded, config).unwrap();
705        assert_eq!(value, decoded);
706
707        // Test array of size 32
708        let value: [u8; 32] = [0; 32];
709        let encoded = crate::encode_to_vec(&value, config).unwrap();
710        let (decoded, _): ([u8; 32], usize) = crate::decode_from_slice(&encoded, config).unwrap();
711        assert_eq!(value, decoded);
712    }
713
714    #[test]
715    fn test_invalid_char() {
716        let config = config::standard();
717        let mut writer = Writer::new(config);
718        // Write an invalid char code
719        writer.write_u32(0x110000).unwrap();
720        let bytes = writer.into_bytes();
721        
722        let mut reader = crate::reader::Reader::new(&bytes, config);
723        let result: Result<char> = char::decode(&mut reader);
724        assert!(result.is_err());
725    }
726
727    #[test]
728    fn test_invalid_utf8() {
729        let config = config::standard();
730        // Create invalid UTF-8 bytes
731        let invalid_bytes = vec![0xFF, 0xFE, 0xFD];
732        let mut writer = Writer::new(config);
733        invalid_bytes.encode(&mut writer).unwrap();
734        let bytes = writer.into_bytes();
735        
736        let mut reader = crate::reader::Reader::new(&bytes, config);
737        let result: Result<String> = String::decode(&mut reader);
738        assert!(result.is_err());
739    }
740}
741
742// Test no-std Vec implementations when std feature is disabled
743#[cfg(all(test, not(feature = "std")))]
744mod no_std_tests {
745    use super::*;
746    use crate::config;
747    extern crate alloc;
748
749    #[test]
750    fn test_no_std_vec_encode() {
751        let config = config::standard();
752        let value = alloc::vec![1u32, 2, 3, 4, 5];
753        let encoded = crate::encode_to_vec(&value, config).unwrap();
754        let (decoded, _): (alloc::vec::Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
755        assert_eq!(value, decoded);
756    }
757
758    #[test]
759    fn test_no_std_vec_empty() {
760        let config = config::standard();
761        let value: alloc::vec::Vec<u32> = alloc::vec![];
762        let encoded = crate::encode_to_vec(&value, config).unwrap();
763        let (decoded, _): (alloc::vec::Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
764        assert_eq!(value, decoded);
765    }
766}