le_stream/prefixed/
std.rs1#![cfg(feature = "std")]
2
3use alloc::boxed::Box;
4use alloc::vec::Vec;
5use core::fmt::Debug;
6use core::iter::Chain;
7use core::marker::PhantomData;
8
9use crate::{FromLeStream, Prefixed, ToLeStream};
10
11impl<P, T> FromLeStream for Prefixed<P, Box<[T]>>
12where
13 P: Into<usize> + FromLeStream,
14 T: FromLeStream,
15{
16 fn from_le_stream<I>(mut bytes: I) -> Option<Self>
17 where
18 I: Iterator<Item = u8>,
19 {
20 let size: usize = P::from_le_stream(&mut bytes)?.into();
21 let mut data = Vec::with_capacity(size);
22
23 for _ in 0..size {
24 data.push(T::from_le_stream(&mut bytes)?);
25 }
26
27 Some(Self {
28 data: data.into_boxed_slice(),
29 prefix: PhantomData,
30 })
31 }
32}
33
34impl<P, T> ToLeStream for Prefixed<P, Box<[T]>>
35where
36 P: TryFrom<usize, Error: Debug> + ToLeStream,
37 T: ToLeStream,
38{
39 type Iter = Chain<<P as ToLeStream>::Iter, <Vec<T> as ToLeStream>::Iter>;
40
41 fn to_le_stream(self) -> Self::Iter {
42 <P as TryFrom<usize>>::try_from(self.data.len())
43 .expect("amount of items should fit into prefix")
44 .to_le_stream()
45 .chain(self.data.to_le_stream())
46 }
47}
48
49impl<T> From<Box<[T]>> for Prefixed<usize, Box<[T]>> {
50 fn from(data: Box<[T]>) -> Self {
51 Self {
52 data,
53 prefix: PhantomData,
54 }
55 }
56}
57
58impl<T> TryFrom<Box<[T]>> for Prefixed<u8, Box<[T]>> {
59 type Error = Box<[T]>;
60
61 fn try_from(data: Box<[T]>) -> Result<Self, Self::Error> {
62 if data.len() > usize::from(u8::MAX) {
63 return Err(data);
64 }
65
66 Ok(Self {
67 data,
68 prefix: PhantomData,
69 })
70 }
71}
72
73impl<T> TryFrom<Box<[T]>> for Prefixed<u16, Box<[T]>> {
74 type Error = Box<[T]>;
75
76 fn try_from(data: Box<[T]>) -> Result<Self, Self::Error> {
77 if data.len() > usize::from(u16::MAX) {
78 return Err(data);
79 }
80
81 Ok(Self {
82 data,
83 prefix: PhantomData,
84 })
85 }
86}