1#![forbid(unsafe_code, missing_docs)]
2#![cfg_attr(test, deny(warnings))]
3mod error;
162mod fixedwidth;
163pub use fixedwidth::{FixedWidthEncoding, FixedWidthU32, FixedWidthU64, FixedWidthUint};
164use std::{
165 any::type_name,
166 net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6},
167};
168
169pub use crate::error::{EncodingError, EncodingErrorKind};
170
171pub const U16_SIGNIFIER: u8 = 0xfd;
173pub const U32_SIGNIFIER: u8 = 0xfe;
175pub const U64_SIGNIFIER: u8 = 0xff;
177
178const U16_SIZE: usize = 2;
179const U32_SIZE: usize = 4;
180const U64_SIZE: usize = 8;
181
182pub const PORT_ENCODED_SIZE: usize = 2; pub const IPV4_ADDR_ENCODED_SIZE: usize = 4;
186pub const IPV6_ADDR_ENCODED_SIZE: usize = 16;
188pub const SOCKET_ADDR_V4_ENCODED_SIZE: usize = IPV4_ADDR_ENCODED_SIZE + PORT_ENCODED_SIZE;
190pub const SOCKET_ADDR_V6_ENCODED_SIZE: usize = IPV6_ADDR_ENCODED_SIZE + PORT_ENCODED_SIZE;
192
193pub trait CompactEncoding<Decode: ?Sized = Self> {
195 fn encoded_size(&self) -> Result<usize, EncodingError>;
197
198 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError>;
200
201 fn decode(buffer: &[u8]) -> Result<(Decode, &[u8]), EncodingError>
204 where
205 Decode: Sized;
206
207 fn to_encoded_bytes(&self) -> Result<Box<[u8]>, EncodingError> {
218 let mut buff = self.create_buffer()?;
219 self.encode(&mut buff)?;
220 Ok(buff)
221 }
222 fn create_buffer(&self) -> Result<Box<[u8]>, EncodingError> {
232 Ok(vec![0; self.encoded_size()?].into_boxed_slice())
233 }
234
235 fn encode_with_len<'a>(
237 &self,
238 buffer: &'a mut [u8],
239 ) -> Result<(&'a mut [u8], usize), EncodingError> {
240 let before_len = buffer.len();
241 let rest = self.encode(buffer)?;
242 let num_encoded_bytes = before_len - rest.len();
243 Ok((rest, num_encoded_bytes))
244 }
245
246 fn decode_with_len(buffer: &[u8]) -> Result<(Decode, &[u8], usize), EncodingError>
248 where
249 Decode: Sized,
250 {
251 let (out, rest) = Self::decode(buffer)?;
252 Ok((out, rest, buffer.len() - rest.len()))
253 }
254}
255
256pub trait VecEncodable<Decode = Self>: CompactEncoding<Decode> {
258 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
260 where
261 Self: Sized;
262
263 fn vec_encode<'a>(vec: &[Self], buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError>
265 where
266 Self: Sized + CompactEncoding,
267 {
268 encode_vec(vec, buffer)
269 }
270
271 fn vec_decode(buffer: &[u8]) -> Result<(Vec<Decode>, &[u8]), EncodingError>
273 where
274 Decode: Sized + CompactEncoding,
275 {
276 decode_vec(buffer)
277 }
278}
279
280#[allow(clippy::borrowed_box)]
282pub trait BoxedSliceEncodable: CompactEncoding {
284 fn boxed_slice_encoded_size(boxed: &Box<[Self]>) -> Result<usize, EncodingError>
286 where
287 Self: Sized;
288
289 fn boxed_slice_encode<'a>(
291 vec: &Box<[Self]>,
292 buffer: &'a mut [u8],
293 ) -> Result<&'a mut [u8], EncodingError>
294 where
295 Self: Sized,
296 {
297 encode_vec(vec, buffer)
298 }
299
300 fn boxed_slice_decode(buffer: &[u8]) -> Result<(Box<[Self]>, &[u8]), EncodingError>
302 where
303 Self: Sized,
304 {
305 let (result, rest) = decode_vec(buffer)?;
306 Ok((result.into_boxed_slice(), rest))
307 }
308}
309
310#[macro_export]
311macro_rules! sum_encoded_size {
332 ($($val:expr),+) => {{
333 0
334 $(
335 + $val.encoded_size()?
336 )*
337 }}
338}
339
340#[macro_export]
341macro_rules! create_buffer {
354 ($($val:expr),+) => {{
355 let len = (
356 0
357 $(
358 + $val.encoded_size()?
359 )*
360 );
361 vec![0; len].into_boxed_slice()
362 }}
363}
364
365#[macro_export]
366macro_rules! map_encode {
379 ($buffer:expr$(,)*) => {
380 $buffer
381 };
382 ($buffer:expr, $field:expr) => {
384 $field.encode($buffer)?
385 };
386 ($buffer:expr, $first:expr, $($rest:expr),+) => {{
388 let rest = $first.encode($buffer)?;
389 map_encode!(rest, $($rest),+)
390 }};
391}
392
393#[macro_export]
394macro_rules! to_encoded_bytes {
403 ($($val:expr),*) => {{
404 use $crate::{map_encode, create_buffer, CompactEncoding};
405 let mut buffer = create_buffer!($($val),*);
406 map_encode!(&mut buffer, $($val),*);
407 buffer
408 }}
409}
410
411#[macro_export]
412macro_rules! map_decode {
425 ($buffer:expr, [
426 $($field_type:ty),* $(,)?
427 ]) => {{
428 use $crate::CompactEncoding;
429 let mut current_buffer: &[u8] = $buffer;
430
431 let result_tuple = (
433 $(
434 match <$field_type>::decode(¤t_buffer)? {
435 (value, new_buf) => {
436 current_buffer = new_buf;
437 value
438 }
439 },
440 )*
441 );
442 (result_tuple, current_buffer)
443 }};
444}
445
446#[macro_export]
447macro_rules! map_first {
450 ($res:expr, $f:expr) => {{
451 let (one, two) = $res;
452 let mapped = $f(one);
453 (mapped, two)
454 }};
455}
456
457#[macro_export]
458macro_rules! map_first_result {
460 ($res:expr, $f:expr) => {{
461 let (one, two) = $res;
462 let mapped = $f(one)?;
463 (mapped, two)
464 }};
465}
466
467pub fn get_slices_checked(buffer: &[u8], mid: usize) -> Result<(&[u8], &[u8]), EncodingError> {
469 buffer.split_at_checked(mid).ok_or_else(|| {
470 EncodingError::out_of_bounds(&format!(
471 "Could not split slice at [{mid}] slice.len() = [{}]",
472 buffer.len()
473 ))
474 })
475}
476
477pub fn get_slices_mut_checked(
480 buffer: &mut [u8],
481 mid: usize,
482) -> Result<(&mut [u8], &mut [u8]), EncodingError> {
483 let len = buffer.len();
484 buffer.split_at_mut_checked(mid).ok_or_else(|| {
485 EncodingError::out_of_bounds(&format!(
486 "Could not split mut slice at [{mid}] slice.len() = [{len}]"
487 ))
488 })
489}
490
491pub fn as_array<const N: usize>(buffer: &[u8]) -> Result<&[u8; N], EncodingError> {
493 let blen = buffer.len();
494 if blen != N {
495 return Err(EncodingError::out_of_bounds(&format!(
496 "Could get a [{N}] byte array from a slice of length [{blen}]"
497 )));
498 }
499 Ok(buffer.split_first_chunk::<N>().expect("checked above").0)
500}
501
502pub fn as_array_mut<const N: usize>(buffer: &mut [u8]) -> Result<&mut [u8; N], EncodingError> {
504 let blen = buffer.len();
505 if blen != N {
506 return Err(EncodingError::out_of_bounds(&format!(
507 "Could get a [{N}] byte array from a slice of length [{blen}]"
508 )));
509 }
510 Ok(buffer
511 .split_first_chunk_mut::<N>()
512 .expect("checked above")
513 .0)
514}
515
516pub fn write_array<'a, const N: usize>(
519 source: &[u8; N],
520 buffer: &'a mut [u8],
521) -> std::result::Result<&'a mut [u8], EncodingError> {
522 let blen = buffer.len();
523 let Some((dest, rest)) = buffer.split_first_chunk_mut::<N>() else {
524 return Err(EncodingError::out_of_bounds(&format!(
525 "Could not write [{}] bytes to buffer of length [{}]",
526 N, blen
527 )));
528 };
529 dest.copy_from_slice(source);
530 Ok(rest)
531}
532
533pub fn take_array<const N: usize>(
535 buffer: &[u8],
536) -> std::result::Result<([u8; N], &[u8]), EncodingError> {
537 let Some((out, rest)) = buffer.split_first_chunk::<N>() else {
538 return Err(EncodingError::out_of_bounds(&format!(
539 "Could not take [{}] bytes from buffer of length [{}]",
540 N,
541 buffer.len()
542 )));
543 };
544 Ok((*out, rest))
545}
546pub fn take_array_mut<const N: usize>(
548 buffer: &mut [u8],
549) -> std::result::Result<(&mut [u8; N], &mut [u8]), EncodingError> {
550 let blen = buffer.len();
551 let Some((out, rest)) = buffer.split_first_chunk_mut::<N>() else {
552 return Err(EncodingError::out_of_bounds(&format!(
553 "Could not write [{}] bytes to buffer of length [{blen}]",
554 N,
555 )));
556 };
557 Ok((out, rest))
558}
559
560pub fn write_slice<'a>(source: &[u8], buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
562 let mid = source.len();
563 let (dest, rest) = get_slices_mut_checked(buffer, mid)?;
564 dest.copy_from_slice(source);
565 Ok(rest)
566}
567
568pub fn bytes_fixed_from_vec<const N: usize>(value: &[u8]) -> Result<[u8; N], EncodingError> {
570 <[u8; N]>::try_from(value).map_err(|e| {
571 EncodingError::invalid_data(&format!(
572 "Could not covert slice with length [{}] to array of length [{}]. Error: [{e}]",
573 value.len(),
574 N
575 ))
576 })
577}
578
579fn encoded_size_str(value: &str) -> Result<usize, EncodingError> {
580 Ok(encoded_size_usize(value.len()) + value.len())
581}
582
583pub fn encoded_size_usize(val: usize) -> usize {
585 if val < U16_SIGNIFIER.into() {
586 1
587 } else if val <= 0xffff {
588 3
589 } else if val <= 0xffffffff {
590 5
591 } else {
592 9
593 }
594}
595
596pub fn encoded_size_var_u64(val: u64) -> usize {
599 if val < U16_SIGNIFIER.into() {
600 1
601 } else if val <= 0xffff {
602 3
603 } else if val <= 0xffffffff {
604 5
605 } else {
606 9
607 }
608}
609
610pub fn encode_var_u64(uint: u64, buffer: &mut [u8]) -> Result<&mut [u8], EncodingError> {
612 if uint < U16_SIGNIFIER.into() {
613 encode_u8(uint as u8, buffer)
614 } else if uint <= 0xffff {
615 let rest = write_array(&[U16_SIGNIFIER], buffer)?;
616 encode_u16(uint as u16, rest)
617 } else if uint <= 0xffffffff {
618 let rest = write_array(&[U32_SIGNIFIER], buffer)?;
619 encode_u32(uint as u32, rest)
620 } else {
621 let rest = write_array(&[U64_SIGNIFIER], buffer)?;
622 encode_u64(uint, rest)
623 }
624}
625
626pub fn decode_usize(buffer: &[u8]) -> Result<(usize, &[u8]), EncodingError> {
629 let ([first], rest) = take_array::<1>(buffer)?;
630 Ok(match first {
631 x if x < U16_SIGNIFIER => (x.into(), rest),
632 U16_SIGNIFIER => map_first!(decode_u16(rest)?, |x: u16| x.into()),
633 U32_SIGNIFIER => {
634 map_first_result!(decode_u32(rest)?, |val| usize::try_from(val)
635 .map_err(|_| EncodingError::overflow("Could not convert u32 to usize")))
636 }
637 _ => {
638 map_first_result!(decode_u64(rest)?, |val| usize::try_from(val)
639 .map_err(|_| EncodingError::overflow("Could not convert u64 to usize")))
640 }
641 })
642}
643
644pub fn encode_bytes_fixed<'a, const N: usize>(
655 value: &[u8; N],
656 buffer: &'a mut [u8],
657) -> Result<&'a mut [u8], EncodingError> {
658 write_array(value, buffer)
659}
660
661pub fn decode_bytes_fixed<const N: usize>(
672 buffer: &[u8],
673) -> Result<([u8; N], &[u8]), EncodingError> {
674 take_array(buffer)
675 }
677
678fn decode_u16(buffer: &[u8]) -> Result<(u16, &[u8]), EncodingError> {
679 let (data, rest) = take_array::<2>(buffer)?;
680 Ok((u16::from_le_bytes(data), rest))
681}
682fn decode_u32(buffer: &[u8]) -> Result<(u32, &[u8]), EncodingError> {
683 let (data, rest) = take_array::<4>(buffer)?;
684 Ok((u32::from_le_bytes(data), rest))
685}
686fn decode_u64(buffer: &[u8]) -> Result<(u64, &[u8]), EncodingError> {
687 let (data, rest) = take_array::<8>(buffer)?;
688 Ok((u64::from_le_bytes(data), rest))
689}
690
691fn decode_u32_var(buffer: &[u8]) -> Result<(u32, &[u8]), EncodingError> {
692 let ([first], rest) = take_array::<1>(buffer)?;
693 Ok(match first {
694 x if x < U16_SIGNIFIER => (x.into(), rest),
695 U16_SIGNIFIER => {
696 let (val, rest) = decode_u16(rest)?;
697 (val.into(), rest)
698 }
699 _ => decode_u32(rest)?,
700 })
701}
702
703fn decode_u64_var(buffer: &[u8]) -> Result<(u64, &[u8]), EncodingError> {
704 let ([first], rest) = take_array::<1>(buffer)?;
705 Ok(match first {
706 x if x < U16_SIGNIFIER => (x.into(), rest),
707 U16_SIGNIFIER => map_first!(decode_u16(rest)?, |x: u16| x.into()),
708 U32_SIGNIFIER => map_first!(decode_u32(rest)?, |x: u32| x.into()),
709 _ => decode_u64(rest)?,
710 })
711}
712
713fn decode_buffer_vec(buffer: &[u8]) -> Result<(Vec<u8>, &[u8]), EncodingError> {
714 let (n_bytes, rest) = decode_usize(buffer)?;
715 let (out, rest) = get_slices_checked(rest, n_bytes)?;
716 Ok((out.to_vec(), rest))
717}
718
719fn decode_string(buffer: &[u8]) -> Result<(String, &[u8]), EncodingError> {
720 let (len, rest) = decode_usize(buffer)?;
721 let (str_buff, rest) = get_slices_checked(rest, len)?;
722 let out = String::from_utf8(str_buff.to_vec())
723 .map_err(|e| EncodingError::invalid_data(&format!("String is invalid UTF-8, {e}")))?;
724 Ok((out, rest))
725}
726
727fn encode_u8(val: u8, buffer: &mut [u8]) -> Result<&mut [u8], EncodingError> {
728 write_array(&val.to_le_bytes(), buffer)
729}
730fn encode_u16(val: u16, buffer: &mut [u8]) -> Result<&mut [u8], EncodingError> {
731 write_array(&val.to_le_bytes(), buffer)
732}
733fn encode_u32(val: u32, buffer: &mut [u8]) -> Result<&mut [u8], EncodingError> {
734 write_array(&val.to_le_bytes(), buffer)
735}
736fn encode_u64(val: u64, buffer: &mut [u8]) -> Result<&mut [u8], EncodingError> {
737 write_array(&val.to_le_bytes(), buffer)
738}
739
740pub fn encode_usize_var<'a>(
742 value: &usize,
743 buffer: &'a mut [u8],
744) -> Result<&'a mut [u8], EncodingError> {
745 if *value < U16_SIGNIFIER.into() {
746 encode_u8(*value as u8, buffer)
747 } else if *value <= 0xffff {
748 encode_u16(*value as u16, write_array(&[U16_SIGNIFIER], buffer)?)
749 } else if *value <= 0xffffffff {
750 let value = u32::try_from(*value).map_err(|e| {
751 EncodingError::overflow(&format!(
752 "count not covert usize [{value}] to u32. Error: [{e}]"
753 ))
754 })?;
755 encode_u32(value, write_array(&[U32_SIGNIFIER], buffer)?)
756 } else {
757 let value = u64::try_from(*value).map_err(|e| {
758 EncodingError::overflow(&format!(
759 "count not covert usize [{value}] to u64. Error: [{e}]"
760 ))
761 })?;
762 encode_u64(value, write_array(&[U64_SIGNIFIER], buffer)?)
763 }
764}
765
766fn encode_str<'a>(value: &str, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
767 let rest = encode_usize_var(&value.len(), buffer)?;
768 write_slice(value.as_bytes(), rest)
769}
770
771fn encode_buffer<'a>(value: &[u8], buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
772 let rest = encode_usize_var(&value.len(), buffer)?;
773 write_slice(value, rest)
774}
775
776impl<const N: usize> CompactEncoding for [u8; N] {
777 fn encoded_size(&self) -> Result<usize, EncodingError> {
778 Ok(N)
779 }
780
781 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
782 write_array(self, buffer)
783 }
784
785 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
786 where
787 Self: Sized,
788 {
789 take_array(buffer)
790 }
791}
792
793impl CompactEncoding for u8 {
794 fn encoded_size(&self) -> Result<usize, EncodingError> {
795 Ok(1)
796 }
797
798 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
799 write_array(&[*self], buffer)
800 }
801
802 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
803 where
804 Self: Sized,
805 {
806 let ([out], rest) = take_array::<1>(buffer)?;
807 Ok((out, rest))
808 }
809}
810
811impl CompactEncoding for u16 {
812 fn encoded_size(&self) -> Result<usize, EncodingError> {
813 Ok(U16_SIZE)
814 }
815
816 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
817 encode_u16(*self, buffer)
818 }
819
820 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
821 where
822 Self: Sized,
823 {
824 decode_u16(buffer)
825 }
826}
827
828impl CompactEncoding for u32 {
830 fn encoded_size(&self) -> Result<usize, EncodingError> {
831 Ok(encoded_size_usize(*self as usize))
832 }
833
834 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
835 encode_usize_var(&(*self as usize), buffer)
836 }
837
838 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
839 where
840 Self: Sized,
841 {
842 decode_u32_var(buffer)
843 }
844}
845impl CompactEncoding for u64 {
846 fn encoded_size(&self) -> Result<usize, EncodingError> {
847 Ok(encoded_size_var_u64(*self))
848 }
849
850 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
851 encode_var_u64(*self, buffer)
852 }
853
854 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
855 where
856 Self: Sized,
857 {
858 decode_u64_var(buffer)
859 }
860}
861
862impl CompactEncoding for usize {
863 fn encoded_size(&self) -> Result<usize, EncodingError> {
864 Ok(encoded_size_usize(*self))
865 }
866
867 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
868 encode_usize_var(self, buffer)
869 }
870
871 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
872 where
873 Self: Sized,
874 {
875 decode_usize(buffer)
876 }
877}
878
879impl CompactEncoding for String {
880 fn encoded_size(&self) -> Result<usize, EncodingError> {
881 encoded_size_str(self)
882 }
883
884 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
885 encode_str(self, buffer)
886 }
887
888 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
889 where
890 Self: Sized,
891 {
892 decode_string(buffer)
893 }
894}
895
896impl CompactEncoding<String> for str {
897 fn encoded_size(&self) -> Result<usize, EncodingError> {
898 encoded_size_str(self)
899 }
900
901 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
902 encode_str(self, buffer)
903 }
904
905 fn decode(buffer: &[u8]) -> Result<(String, &[u8]), EncodingError> {
906 decode_string(buffer)
907 }
908}
909
910impl CompactEncoding for Vec<String> {
911 fn encoded_size(&self) -> Result<usize, EncodingError> {
912 let mut out = encoded_size_usize(self.len());
913 for s in self {
914 out += s.encoded_size()?;
915 }
916 Ok(out)
917 }
918
919 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
920 let mut rest = encode_usize_var(&self.len(), buffer)?;
921 for s in self {
922 rest = s.encode(rest)?;
923 }
924 Ok(rest)
925 }
926
927 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
928 where
929 Self: Sized,
930 {
931 let (len, mut rest) = decode_usize(buffer)?;
932 let mut out = Vec::with_capacity(len);
933 for _ in 0..len {
934 let result = String::decode(rest)?;
935 out.push(result.0);
936 rest = result.1;
937 }
938 Ok((out, rest))
939 }
940}
941
942impl CompactEncoding for Vec<u8> {
943 fn encoded_size(&self) -> Result<usize, EncodingError> {
944 Ok(encoded_size_usize(self.len()) + self.len())
945 }
946
947 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
948 encode_buffer(self, buffer)
949 }
950
951 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
952 where
953 Self: Sized,
954 {
955 decode_buffer_vec(buffer)
956 }
957}
958impl CompactEncoding<Vec<u8>> for &[u8] {
959 fn encoded_size(&self) -> Result<usize, EncodingError> {
960 Ok(encoded_size_usize(self.len()) + self.len())
961 }
962
963 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
964 encode_buffer(self, buffer)
965 }
966
967 fn decode(buffer: &[u8]) -> Result<(Vec<u8>, &[u8]), EncodingError>
968 where
969 Self: Sized,
970 {
971 decode_buffer_vec(buffer)
972 }
973}
974
975impl CompactEncoding for Ipv4Addr {
976 fn encoded_size(&self) -> std::result::Result<usize, EncodingError> {
977 Ok(U32_SIZE)
978 }
979
980 fn encode<'a>(&self, buffer: &'a mut [u8]) -> std::result::Result<&'a mut [u8], EncodingError> {
981 let Some((dest, rest)) = buffer.split_first_chunk_mut::<4>() else {
982 return Err(EncodingError::out_of_bounds(&format!(
983 "Colud not encode {}, not enough room in buffer",
984 type_name::<Self>()
985 )));
986 };
987 dest.copy_from_slice(&self.octets());
988 Ok(rest)
989 }
990
991 fn decode(buffer: &[u8]) -> std::result::Result<(Self, &[u8]), EncodingError>
992 where
993 Self: Sized,
994 {
995 let Some((dest, rest)) = buffer.split_first_chunk::<4>() else {
996 return Err(EncodingError::out_of_bounds(&format!(
997 "Colud not decode {}, buffer not big enough",
998 type_name::<Self>()
999 )));
1000 };
1001 Ok((Ipv4Addr::from(*dest), rest))
1002 }
1003}
1004
1005impl CompactEncoding for Ipv6Addr {
1006 fn encoded_size(&self) -> std::result::Result<usize, EncodingError> {
1007 Ok(IPV6_ADDR_ENCODED_SIZE)
1008 }
1009
1010 fn encode<'a>(&self, buffer: &'a mut [u8]) -> std::result::Result<&'a mut [u8], EncodingError> {
1019 let Some((dest, rest)) = buffer.split_first_chunk_mut::<16>() else {
1020 return Err(EncodingError::out_of_bounds(&format!(
1021 "Colud not encode {}, not enough room in buffer",
1022 type_name::<Self>()
1023 )));
1024 };
1025 dest.copy_from_slice(&self.octets());
1026 Ok(rest)
1027 }
1028
1029 fn decode(buffer: &[u8]) -> std::result::Result<(Self, &[u8]), EncodingError>
1030 where
1031 Self: Sized,
1032 {
1033 let Some((dest, rest)) = buffer.split_first_chunk::<16>() else {
1034 return Err(EncodingError::out_of_bounds(&format!(
1035 "Colud not decode {}, buffer not big enough",
1036 type_name::<Self>()
1037 )));
1038 };
1039 Ok((Ipv6Addr::from(*dest), rest))
1040 }
1041}
1042
1043fn encode_vec<'a, T: CompactEncoding + Sized>(
1044 vec: &[T],
1045 buffer: &'a mut [u8],
1046) -> Result<&'a mut [u8], EncodingError> {
1047 let mut rest = encode_usize_var(&vec.len(), buffer)?;
1048 for x in vec {
1049 rest = <T as CompactEncoding>::encode(x, rest)?;
1050 }
1051 Ok(rest)
1052}
1053
1054fn decode_vec<T: CompactEncoding + Sized>(buffer: &[u8]) -> Result<(Vec<T>, &[u8]), EncodingError> {
1055 let (len, mut rest) = decode_usize(buffer)?;
1056 let mut out = Vec::with_capacity(len);
1057 for _ in 0..len {
1058 let res = <T as CompactEncoding>::decode(rest)?;
1059 out.push(res.0);
1060 rest = res.1;
1061 }
1062 Ok((out, rest))
1063}
1064
1065impl<T: VecEncodable> CompactEncoding for Vec<T> {
1066 fn encoded_size(&self) -> Result<usize, EncodingError> {
1067 T::vec_encoded_size(self)
1068 }
1069
1070 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1071 <T as VecEncodable>::vec_encode(self, buffer)
1072 }
1073
1074 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1075 where
1076 Self: Sized,
1077 {
1078 <T as VecEncodable>::vec_decode(buffer)
1079 }
1080}
1081
1082impl<T, D> CompactEncoding<Vec<D>> for &[T]
1083where
1084 T: VecEncodable<D> + CompactEncoding<D>,
1085 D: CompactEncoding,
1086{
1087 fn encoded_size(&self) -> Result<usize, EncodingError> {
1088 T::vec_encoded_size(self)
1089 }
1090
1091 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1092 let mut rest = encode_usize_var(&self.len(), buffer)?;
1093 for x in *self {
1094 rest = x.encode(rest)?;
1095 }
1096 Ok(rest)
1097 }
1098
1099 fn decode(buffer: &[u8]) -> Result<(Vec<D>, &[u8]), EncodingError>
1100 where
1101 D: Sized,
1102 {
1103 decode_vec(buffer)
1104 }
1105}
1106
1107pub fn vec_encoded_size_for_fixed_sized_elements<T: CompactEncoding>(
1109 vec: &[T],
1110 element_encoded_size: usize,
1111) -> usize {
1112 encoded_size_usize(vec.len()) + (vec.len() * element_encoded_size)
1113}
1114
1115impl VecEncodable for u32 {
1116 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1117 where
1118 Self: Sized,
1119 {
1120 Ok(encoded_size_usize(vec.len()) + (vec.len() * 4))
1121 }
1122 fn vec_encode<'a>(vec: &[Self], buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError>
1124 where
1125 Self: Sized,
1126 {
1127 let mut rest = encode_usize_var(&vec.len(), buffer)?;
1128 for x in vec {
1129 rest = encode_u32(*x, rest)?;
1130 }
1131 Ok(rest)
1132 }
1133
1134 fn vec_decode(buffer: &[u8]) -> Result<(Vec<Self>, &[u8]), EncodingError>
1136 where
1137 Self: Sized,
1138 {
1139 let (len, mut rest) = decode_usize(buffer)?;
1140 let mut out = Vec::with_capacity(len);
1141
1142 for _ in 0..len {
1143 let result = decode_u32(rest)?;
1144 out.push(result.0);
1145 rest = result.1;
1146 }
1147 Ok((out, rest))
1148 }
1149}
1150
1151impl<const N: usize> VecEncodable for [u8; N] {
1152 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1153 where
1154 Self: Sized,
1155 {
1156 Ok(encoded_size_usize(vec.len()) + (vec.len() * N))
1157 }
1158}
1159
1160impl BoxedSliceEncodable for u8 {
1161 fn boxed_slice_encoded_size(boxed: &Box<[Self]>) -> Result<usize, EncodingError>
1162 where
1163 Self: Sized,
1164 {
1165 Ok(encoded_size_usize(boxed.len()) + boxed.len())
1166 }
1167
1168 fn boxed_slice_encode<'a>(
1169 boxed: &Box<[Self]>,
1170 buffer: &'a mut [u8],
1171 ) -> Result<&'a mut [u8], EncodingError>
1172 where
1173 Self: Sized,
1174 {
1175 let rest = encode_usize_var(&boxed.len(), buffer)?;
1176 write_slice(boxed, rest)
1177 }
1178
1179 fn boxed_slice_decode(buffer: &[u8]) -> Result<(Box<[Self]>, &[u8]), EncodingError>
1180 where
1181 Self: Sized,
1182 {
1183 let (len, rest) = decode_usize(buffer)?;
1184 let (out, rest) = get_slices_checked(rest, len)?;
1185 Ok((out.into(), rest))
1186 }
1187}
1188
1189impl<T: BoxedSliceEncodable> CompactEncoding for Box<[T]> {
1190 fn encoded_size(&self) -> Result<usize, EncodingError> {
1191 T::boxed_slice_encoded_size(self)
1192 }
1193
1194 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1195 <T as BoxedSliceEncodable>::boxed_slice_encode(self, buffer)
1196 }
1197
1198 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1199 where
1200 Self: Sized,
1201 {
1202 <T as BoxedSliceEncodable>::boxed_slice_decode(buffer)
1203 }
1204}
1205
1206impl CompactEncoding for SocketAddrV4 {
1207 fn encoded_size(&self) -> Result<usize, EncodingError> {
1208 Ok(SOCKET_ADDR_V4_ENCODED_SIZE)
1209 }
1210
1211 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1220 let rest = self.ip().encode(buffer)?;
1221 encode_u16(self.port(), rest)
1222 }
1223
1224 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1225 where
1226 Self: Sized,
1227 {
1228 let (ip, rest) = Ipv4Addr::decode(buffer)?;
1229 let (port, rest) = decode_u16(rest)?;
1230 Ok((SocketAddrV4::new(ip, port), rest))
1231 }
1232}
1233impl CompactEncoding for SocketAddrV6 {
1234 fn encoded_size(&self) -> Result<usize, EncodingError> {
1235 Ok(SOCKET_ADDR_V6_ENCODED_SIZE)
1236 }
1237
1238 fn encode<'a>(&self, buffer: &'a mut [u8]) -> Result<&'a mut [u8], EncodingError> {
1247 let rest = self.ip().encode(buffer)?;
1248 encode_u16(self.port(), rest)
1249 }
1250
1251 fn decode(buffer: &[u8]) -> Result<(Self, &[u8]), EncodingError>
1252 where
1253 Self: Sized,
1254 {
1255 let (ip, rest) = Ipv6Addr::decode(buffer)?;
1256 let (port, rest) = decode_u16(rest)?;
1257 Ok((SocketAddrV6::new(ip, port, 0, 0), rest))
1259 }
1260}
1261
1262impl VecEncodable for SocketAddrV4 {
1263 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1264 where
1265 Self: Sized,
1266 {
1267 Ok(vec_encoded_size_for_fixed_sized_elements(
1268 vec,
1269 SOCKET_ADDR_V4_ENCODED_SIZE,
1270 ))
1271 }
1272}
1273
1274impl VecEncodable for SocketAddrV6 {
1275 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1276 where
1277 Self: Sized,
1278 {
1279 Ok(vec_encoded_size_for_fixed_sized_elements(
1280 vec,
1281 SOCKET_ADDR_V6_ENCODED_SIZE,
1282 ))
1283 }
1284}
1285
1286impl VecEncodable for Vec<u8> {
1287 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1288 where
1289 Self: Sized,
1290 {
1291 let mut out = encoded_size_usize(vec.len());
1292 for v in vec {
1293 out += v.encoded_size()?;
1294 }
1295 Ok(out)
1296 }
1297}
1298
1299impl VecEncodable<Vec<u8>> for &[u8] {
1300 fn vec_encoded_size(vec: &[Self]) -> Result<usize, EncodingError>
1301 where
1302 Self: Sized,
1303 {
1304 let mut out = encoded_size_usize(vec.len());
1305 for v in vec {
1306 out += v.encoded_size()?;
1307 }
1308 Ok(out)
1309 }
1310}
1311
1312#[cfg(test)]
1313mod test {
1314 use super::*;
1315
1316 #[test]
1317 fn decode_buff_vec() -> Result<(), EncodingError> {
1318 let buf = &[1, 1];
1319 let (a, b) = decode_buffer_vec(buf)?;
1320 assert_eq!(a, &[1]);
1321 assert_eq!(b, &[]);
1322 Ok(())
1323 }
1324 macro_rules! check_usize_var_enc_dec {
1325 ($size:expr, $value:expr) => {
1326 let mut buffer = vec![0; encoded_size_usize($value)];
1327 assert_eq!(buffer.len(), $size);
1328 let remaining = encode_usize_var(&$value, &mut buffer)?;
1329 assert!(remaining.is_empty());
1330 let (result, rest) = decode_usize(&buffer)?;
1331 assert!(rest.is_empty());
1332 assert_eq!(result, $value);
1333 };
1334 }
1335
1336 #[test]
1337 fn usize_var_enc_dec() -> Result<(), EncodingError> {
1338 check_usize_var_enc_dec!(1, 42);
1339 check_usize_var_enc_dec!(1 + 2, 256);
1340 check_usize_var_enc_dec!(1 + 4, 65536);
1341 check_usize_var_enc_dec!(1 + 8, 4294967296);
1342
1343 Ok(())
1344 }
1345 #[test]
1346 fn enc_dec_vec_vec_u8() -> Result<(), EncodingError> {
1347 let input = vec![b"hello".to_vec(), b"goodbye".to_vec()];
1348 let buf = input.as_slice().to_encoded_bytes()?;
1349 let (result, rest): (Vec<Vec<u8>>, &[u8]) = Vec::<Vec<u8>>::decode(&buf)?;
1350 assert_eq!(result.len(), input.len());
1351 for (i, v) in result.iter().enumerate() {
1352 assert_eq!(v, &input[i]);
1353 }
1354 assert!(rest.is_empty());
1355 Ok(())
1356 }
1357
1358 #[test]
1359 fn enc_dec_slice_slice_u8() -> Result<(), EncodingError> {
1360 let input: &[&[u8]] = &[b"hello".as_slice(), b"goodbye".as_slice()];
1361 let buf = input.to_encoded_bytes()?;
1362 let (result, rest): (Vec<Vec<u8>>, &[u8]) = Vec::<Vec<u8>>::decode(&buf)?;
1363 assert_eq!(result.len(), input.len());
1364 for (i, v) in result.iter().enumerate() {
1365 assert_eq!(v, &input[i]);
1366 }
1367 assert!(rest.is_empty());
1368 Ok(())
1369 }
1370
1371 #[test]
1372 fn enc_dec_byte_slice() -> Result<(), EncodingError> {
1373 let input: &[u8] = b"hello world";
1374 let buf = input.to_encoded_bytes()?;
1375 let (result, rest): (Vec<u8>, &[u8]) = Vec::<u8>::decode(&buf)?;
1376 assert_eq!(result, input);
1377 assert!(rest.is_empty());
1378 Ok(())
1379 }
1380
1381 #[test]
1382 fn enc_dec_empty_slice_slice_u8() -> Result<(), EncodingError> {
1383 let input: &[&[u8]] = &[];
1384 let buf = input.to_encoded_bytes()?;
1385 assert_eq!(buf.len(), 1); let (result, rest): (Vec<Vec<u8>>, &[u8]) = Vec::<Vec<u8>>::decode(&buf)?;
1387 assert!(result.is_empty());
1388 assert!(rest.is_empty());
1389 Ok(())
1390 }
1391
1392 #[test]
1393 fn slice_and_vec_encode_identically() -> Result<(), EncodingError> {
1394 let vec_input = vec![b"hello".to_vec(), b"goodbye".to_vec()];
1395 let slice_input: &[&[u8]] = &[b"hello".as_slice(), b"goodbye".as_slice()];
1396
1397 let vec_buf = vec_input.to_encoded_bytes()?;
1398 let slice_buf = slice_input.to_encoded_bytes()?;
1399
1400 assert_eq!(&*vec_buf, &*slice_buf);
1401 Ok(())
1402 }
1403}