1use crate::reader::Reader;
4use crate::varint::{decode_length, encode_length};
5use crate::writer::Writer;
6use crate::Result;
7
8pub trait Encode {
10 fn encode(&self, writer: &mut Writer) -> Result<()>;
12}
13
14pub trait Decode: Sized {
16 fn decode(reader: &mut Reader) -> Result<Self>;
18}
19
20impl 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#[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)); 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
282impl Encode for &[u8] {
284 fn encode(&self, writer: &mut Writer) -> Result<()> {
285 self.to_vec().encode(writer)
286 }
287}
288
289impl<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
354macro_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
413impl 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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#[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}