le_stream/prefixed/
std.rs

1use 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}