Skip to main content

le_stream/prefixed/
std.rs

1#![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}