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(not(feature = "std"))]
267impl Encode for alloc::string::String {
268    fn encode(&self, writer: &mut Writer) -> Result<()> {
269        self.as_bytes().to_vec().encode(writer)
270    }
271}
272
273#[cfg(feature = "std")]
274impl Decode for String {
275    fn decode(reader: &mut Reader) -> Result<Self> {
276        let bytes = Vec::<u8>::decode(reader)?;
277        String::from_utf8(bytes)
278            .map_err(|e| crate::error::JustcodeError::custom(format!("invalid UTF-8: {}", e)))
279    }
280}
281
282#[cfg(not(feature = "std"))]
283impl Decode for alloc::string::String {
284    fn decode(reader: &mut Reader) -> Result<Self> {
285        extern crate alloc;
286        use alloc::format;
287        let bytes = Vec::<u8>::decode(reader)?;
288        alloc::string::String::from_utf8(bytes)
289            .map_err(|e| crate::error::JustcodeError::custom(format!("invalid UTF-8: {}", e)))
290    }
291}
292
293#[cfg(feature = "std")]
294impl Encode for &str {
295    fn encode(&self, writer: &mut Writer) -> Result<()> {
296        self.as_bytes().to_vec().encode(writer)
297    }
298}
299
300// Implement Encode for &[u8] by converting to Vec
301impl Encode for &[u8] {
302    fn encode(&self, writer: &mut Writer) -> Result<()> {
303        self.to_vec().encode(writer)
304    }
305}
306
307// Tuple implementations
308
309impl<T1: Encode> Encode for (T1,) {
310    fn encode(&self, writer: &mut Writer) -> Result<()> {
311        self.0.encode(writer)
312    }
313}
314
315impl<T1: Decode> Decode for (T1,) {
316    fn decode(reader: &mut Reader) -> Result<Self> {
317        Ok((T1::decode(reader)?,))
318    }
319}
320
321impl<T1: Encode, T2: Encode> Encode for (T1, T2) {
322    fn encode(&self, writer: &mut Writer) -> Result<()> {
323        self.0.encode(writer)?;
324        self.1.encode(writer)
325    }
326}
327
328impl<T1: Decode, T2: Decode> Decode for (T1, T2) {
329    fn decode(reader: &mut Reader) -> Result<Self> {
330        Ok((T1::decode(reader)?, T2::decode(reader)?))
331    }
332}
333
334impl<T1: Encode, T2: Encode, T3: Encode> Encode for (T1, T2, T3) {
335    fn encode(&self, writer: &mut Writer) -> Result<()> {
336        self.0.encode(writer)?;
337        self.1.encode(writer)?;
338        self.2.encode(writer)
339    }
340}
341
342impl<T1: Decode, T2: Decode, T3: Decode> Decode for (T1, T2, T3) {
343    fn decode(reader: &mut Reader) -> Result<Self> {
344        Ok((
345            T1::decode(reader)?,
346            T2::decode(reader)?,
347            T3::decode(reader)?,
348        ))
349    }
350}
351
352impl<T1: Encode, T2: Encode, T3: Encode, T4: Encode> Encode for (T1, T2, T3, T4) {
353    fn encode(&self, writer: &mut Writer) -> Result<()> {
354        self.0.encode(writer)?;
355        self.1.encode(writer)?;
356        self.2.encode(writer)?;
357        self.3.encode(writer)
358    }
359}
360
361impl<T1: Decode, T2: Decode, T3: Decode, T4: Decode> Decode for (T1, T2, T3, T4) {
362    fn decode(reader: &mut Reader) -> Result<Self> {
363        Ok((
364            T1::decode(reader)?,
365            T2::decode(reader)?,
366            T3::decode(reader)?,
367            T4::decode(reader)?,
368        ))
369    }
370}
371
372// Array implementations (up to 32 elements)
373
374macro_rules! impl_array {
375    ($n:expr) => {
376        impl<T: Encode> Encode for [T; $n] {
377            fn encode(&self, writer: &mut Writer) -> Result<()> {
378                for item in self {
379                    item.encode(writer)?;
380                }
381                Ok(())
382            }
383        }
384
385        impl<T: Decode + Copy + Default> Decode for [T; $n] {
386            fn decode(reader: &mut Reader) -> Result<Self> {
387                let mut arr = [T::default(); $n];
388                for item in &mut arr {
389                    *item = T::decode(reader)?;
390                }
391                Ok(arr)
392            }
393        }
394    };
395}
396
397impl_array!(0);
398impl_array!(1);
399impl_array!(2);
400impl_array!(3);
401impl_array!(4);
402impl_array!(5);
403impl_array!(6);
404impl_array!(7);
405impl_array!(8);
406impl_array!(9);
407impl_array!(10);
408impl_array!(11);
409impl_array!(12);
410impl_array!(13);
411impl_array!(14);
412impl_array!(15);
413impl_array!(16);
414impl_array!(17);
415impl_array!(18);
416impl_array!(19);
417impl_array!(20);
418impl_array!(21);
419impl_array!(22);
420impl_array!(23);
421impl_array!(24);
422impl_array!(25);
423impl_array!(26);
424impl_array!(27);
425impl_array!(28);
426impl_array!(29);
427impl_array!(30);
428impl_array!(31);
429impl_array!(32);
430
431// Enum encoding support
432// Enums are encoded as: variant_index (u32 or varint) + variant data
433// The variant index is encoded based on config.variable_int_encoding
434
435impl Encode for () {
436    fn encode(&self, _writer: &mut Writer) -> Result<()> {
437        Ok(())
438    }
439}
440
441impl Decode for () {
442    fn decode(_reader: &mut Reader) -> Result<Self> {
443        Ok(())
444    }
445}
446
447#[cfg(test)]
448mod tests {
449    use super::*;
450    use crate::config;
451
452    #[test]
453    fn test_encode_decode_all_primitives() {
454        let config = config::standard();
455        
456        // Test u8
457        let value = 42u8;
458        let encoded = crate::encode_to_vec(&value, config).unwrap();
459        let (decoded, _): (u8, usize) = crate::decode_from_slice(&encoded, config).unwrap();
460        assert_eq!(value, decoded);
461
462        // Test u16
463        let value = 1000u16;
464        let encoded = crate::encode_to_vec(&value, config).unwrap();
465        let (decoded, _): (u16, usize) = crate::decode_from_slice(&encoded, config).unwrap();
466        assert_eq!(value, decoded);
467
468        // Test u32
469        let value = 100000u32;
470        let encoded = crate::encode_to_vec(&value, config).unwrap();
471        let (decoded, _): (u32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
472        assert_eq!(value, decoded);
473
474        // Test u64
475        let value = 1000000000u64;
476        let encoded = crate::encode_to_vec(&value, config).unwrap();
477        let (decoded, _): (u64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
478        assert_eq!(value, decoded);
479
480        // Test usize
481        let value = 42usize;
482        let encoded = crate::encode_to_vec(&value, config).unwrap();
483        let (decoded, _): (usize, usize) = crate::decode_from_slice(&encoded, config).unwrap();
484        assert_eq!(value, decoded);
485
486        // Test i8
487        let value = -42i8;
488        let encoded = crate::encode_to_vec(&value, config).unwrap();
489        let (decoded, _): (i8, usize) = crate::decode_from_slice(&encoded, config).unwrap();
490        assert_eq!(value, decoded);
491
492        // Test i16
493        let value = -1000i16;
494        let encoded = crate::encode_to_vec(&value, config).unwrap();
495        let (decoded, _): (i16, usize) = crate::decode_from_slice(&encoded, config).unwrap();
496        assert_eq!(value, decoded);
497
498        // Test i32
499        let value = -100000i32;
500        let encoded = crate::encode_to_vec(&value, config).unwrap();
501        let (decoded, _): (i32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
502        assert_eq!(value, decoded);
503
504        // Test i64
505        let value = -1000000000i64;
506        let encoded = crate::encode_to_vec(&value, config).unwrap();
507        let (decoded, _): (i64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
508        assert_eq!(value, decoded);
509
510        // Test f32
511        let value = 3.14f32;
512        let encoded = crate::encode_to_vec(&value, config).unwrap();
513        let (decoded, _): (f32, usize) = crate::decode_from_slice(&encoded, config).unwrap();
514        assert!((value - decoded).abs() < 0.001);
515
516        // Test f64
517        let value = 2.718f64;
518        let encoded = crate::encode_to_vec(&value, config).unwrap();
519        let (decoded, _): (f64, usize) = crate::decode_from_slice(&encoded, config).unwrap();
520        assert!((value - decoded).abs() < 0.0001);
521
522        // Test bool
523        let value = true;
524        let encoded = crate::encode_to_vec(&value, config).unwrap();
525        let (decoded, _): (bool, usize) = crate::decode_from_slice(&encoded, config).unwrap();
526        assert_eq!(value, decoded);
527
528        let value = false;
529        let encoded = crate::encode_to_vec(&value, config).unwrap();
530        let (decoded, _): (bool, usize) = crate::decode_from_slice(&encoded, config).unwrap();
531        assert_eq!(value, decoded);
532
533        // Test char
534        let value = 'A';
535        let encoded = crate::encode_to_vec(&value, config).unwrap();
536        let (decoded, _): (char, usize) = crate::decode_from_slice(&encoded, config).unwrap();
537        assert_eq!(value, decoded);
538
539        let value = '🦊';
540        let encoded = crate::encode_to_vec(&value, config).unwrap();
541        let (decoded, _): (char, usize) = crate::decode_from_slice(&encoded, config).unwrap();
542        assert_eq!(value, decoded);
543    }
544
545    #[test]
546    fn test_encode_decode_primitives() {
547        let config = config::standard();
548        let test_cases: Vec<Box<dyn Fn(&mut Writer) -> Result<()>>> = vec![
549            Box::new(|w| 42u8.encode(w)),
550            Box::new(|w| 1000u16.encode(w)),
551            Box::new(|w| 100000u32.encode(w)),
552            Box::new(|w| 1000000000u64.encode(w)),
553            Box::new(|w| true.encode(w)),
554            Box::new(|w| 3.14f32.encode(w)),
555        ];
556
557        for encode_fn in test_cases {
558            let mut writer = Writer::new(config);
559            encode_fn(&mut writer).unwrap();
560            let bytes = writer.into_bytes();
561            assert!(!bytes.is_empty());
562        }
563    }
564
565    #[test]
566    fn test_encode_decode_vec() {
567        let config = config::standard();
568        let value = vec![1u32, 2, 3, 4, 5];
569        let encoded = crate::encode_to_vec(&value, config).unwrap();
570        let (decoded, _): (Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
571        assert_eq!(value, decoded);
572    }
573
574    #[test]
575    fn test_encode_decode_empty_vec() {
576        let config = config::standard();
577        let value: Vec<u32> = vec![];
578        let encoded = crate::encode_to_vec(&value, config).unwrap();
579        let (decoded, _): (Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
580        assert_eq!(value, decoded);
581    }
582
583    #[test]
584    fn test_encode_decode_large_vec() {
585        let config = config::standard();
586        let value: Vec<u8> = (0u8..255).chain(0u8..255).chain(0u8..255).chain(0u8..235).collect();
587        let encoded = crate::encode_to_vec(&value, config).unwrap();
588        let (decoded, _): (Vec<u8>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
589        assert_eq!(value, decoded);
590    }
591
592    #[test]
593    fn test_encode_decode_option() {
594        let config = config::standard();
595        let value = Some(42u32);
596        let encoded = crate::encode_to_vec(&value, config).unwrap();
597        let (decoded, _): (Option<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
598        assert_eq!(value, decoded);
599
600        let value = None::<u32>;
601        let encoded = crate::encode_to_vec(&value, config).unwrap();
602        let (decoded, _): (Option<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
603        assert_eq!(value, decoded);
604    }
605
606    #[test]
607    fn test_encode_option_none_directly() {
608        let config = config::standard();
609        let mut writer = Writer::new(config);
610        let none: Option<u32> = None;
611        none.encode(&mut writer).unwrap();
612        let bytes = writer.into_bytes();
613        // Should be just a single byte (false)
614        assert_eq!(bytes.len(), 1);
615        assert_eq!(bytes[0], 0);
616    }
617
618    #[test]
619    fn test_encode_option_some_directly() {
620        let config = config::standard();
621        let mut writer = Writer::new(config);
622        let some: Option<u32> = Some(42);
623        some.encode(&mut writer).unwrap();
624        let bytes = writer.into_bytes();
625        // Should be 1 byte (true) + 4 bytes (u32)
626        assert_eq!(bytes.len(), 5);
627        assert_eq!(bytes[0], 1);
628    }
629
630    #[test]
631    fn test_encode_decode_string() {
632        let config = config::standard();
633        let value = "hello, world!".to_string();
634        let encoded = crate::encode_to_vec(&value, config).unwrap();
635        let (decoded, _): (String, usize) = crate::decode_from_slice(&encoded, config).unwrap();
636        assert_eq!(value, decoded);
637    }
638
639    #[test]
640    fn test_encode_decode_str() {
641        let config = config::standard();
642        let value = "hello, world!";
643        let encoded = crate::encode_to_vec(&value, config).unwrap();
644        let (decoded, _): (String, usize) = crate::decode_from_slice(&encoded, config).unwrap();
645        assert_eq!(value, decoded);
646    }
647
648    #[test]
649    fn test_encode_decode_bytes() {
650        let config = config::standard();
651        let value: &[u8] = &[1, 2, 3, 4, 5];
652        let encoded = crate::encode_to_vec(&value, config).unwrap();
653        let (decoded, _): (Vec<u8>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
654        assert_eq!(value, decoded);
655    }
656
657    #[test]
658    fn test_encode_decode_tuple() {
659        let config = config::standard();
660        let value = (42u32, "hello".to_string(), true);
661        let encoded = crate::encode_to_vec(&value, config).unwrap();
662        let (decoded, _): ((u32, String, bool), usize) =
663            crate::decode_from_slice(&encoded, config).unwrap();
664        assert_eq!(value, decoded);
665    }
666
667    #[test]
668    fn test_encode_decode_tuple1() {
669        let config = config::standard();
670        let value = (42u32,);
671        let encoded = crate::encode_to_vec(&value, config).unwrap();
672        let (decoded, _): ((u32,), usize) = crate::decode_from_slice(&encoded, config).unwrap();
673        assert_eq!(value, decoded);
674    }
675
676    #[test]
677    fn test_encode_decode_tuple2() {
678        let config = config::standard();
679        let value = (42u32, "hello".to_string());
680        let encoded = crate::encode_to_vec(&value, config).unwrap();
681        let (decoded, _): ((u32, String), usize) = crate::decode_from_slice(&encoded, config).unwrap();
682        assert_eq!(value, decoded);
683    }
684
685    #[test]
686    fn test_encode_decode_tuple4() {
687        let config = config::standard();
688        let value = (1u32, 2u32, 3u32, 4u32);
689        let encoded = crate::encode_to_vec(&value, config).unwrap();
690        let (decoded, _): ((u32, u32, u32, u32), usize) = crate::decode_from_slice(&encoded, config).unwrap();
691        assert_eq!(value, decoded);
692    }
693
694    #[test]
695    fn test_encode_decode_unit() {
696        let config = config::standard();
697        let value = ();
698        let encoded = crate::encode_to_vec(&value, config).unwrap();
699        let (decoded, _): ((), usize) = crate::decode_from_slice(&encoded, config).unwrap();
700        assert_eq!(value, decoded);
701    }
702
703    #[test]
704    fn test_encode_decode_arrays() {
705        let config = config::standard();
706        
707        // Test array of size 0
708        let value: [u8; 0] = [];
709        let encoded = crate::encode_to_vec(&value, config).unwrap();
710        let (decoded, _): ([u8; 0], usize) = crate::decode_from_slice(&encoded, config).unwrap();
711        assert_eq!(value, decoded);
712
713        // Test array of size 1
714        let value = [42u8];
715        let encoded = crate::encode_to_vec(&value, config).unwrap();
716        let (decoded, _): ([u8; 1], usize) = crate::decode_from_slice(&encoded, config).unwrap();
717        assert_eq!(value, decoded);
718
719        // Test array of size 5
720        let value = [1u32, 2, 3, 4, 5];
721        let encoded = crate::encode_to_vec(&value, config).unwrap();
722        let (decoded, _): ([u32; 5], usize) = crate::decode_from_slice(&encoded, config).unwrap();
723        assert_eq!(value, decoded);
724
725        // Test array of size 32
726        let value: [u8; 32] = [0; 32];
727        let encoded = crate::encode_to_vec(&value, config).unwrap();
728        let (decoded, _): ([u8; 32], usize) = crate::decode_from_slice(&encoded, config).unwrap();
729        assert_eq!(value, decoded);
730    }
731
732    #[test]
733    fn test_invalid_char() {
734        let config = config::standard();
735        let mut writer = Writer::new(config);
736        // Write an invalid char code
737        writer.write_u32(0x110000).unwrap();
738        let bytes = writer.into_bytes();
739        
740        let mut reader = crate::reader::Reader::new(&bytes, config);
741        let result: Result<char> = char::decode(&mut reader);
742        assert!(result.is_err());
743    }
744
745    #[test]
746    fn test_invalid_utf8() {
747        let config = config::standard();
748        // Create invalid UTF-8 bytes
749        let invalid_bytes = vec![0xFF, 0xFE, 0xFD];
750        let mut writer = Writer::new(config);
751        invalid_bytes.encode(&mut writer).unwrap();
752        let bytes = writer.into_bytes();
753        
754        let mut reader = crate::reader::Reader::new(&bytes, config);
755        let result: Result<String> = String::decode(&mut reader);
756        assert!(result.is_err());
757    }
758}
759
760// Test no-std Vec implementations when std feature is disabled
761#[cfg(all(test, not(feature = "std")))]
762mod no_std_tests {
763    use super::*;
764    use crate::config;
765    extern crate alloc;
766
767    #[test]
768    fn test_no_std_vec_encode() {
769        let config = config::standard();
770        let value = alloc::vec![1u32, 2, 3, 4, 5];
771        let encoded = crate::encode_to_vec(&value, config).unwrap();
772        let (decoded, _): (alloc::vec::Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
773        assert_eq!(value, decoded);
774    }
775
776    #[test]
777    fn test_no_std_vec_empty() {
778        let config = config::standard();
779        let value: alloc::vec::Vec<u32> = alloc::vec![];
780        let encoded = crate::encode_to_vec(&value, config).unwrap();
781        let (decoded, _): (alloc::vec::Vec<u32>, usize) = crate::decode_from_slice(&encoded, config).unwrap();
782        assert_eq!(value, decoded);
783    }
784}