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