planus/impls/
planus_vectors.rs

1use crate::{
2    errors::{self, ErrorKind},
3    slice_helpers::SliceWithStartOffset,
4    traits::*,
5    vectors::Vector,
6};
7use core::marker::PhantomData;
8
9impl<'buf, T: VectorRead<'buf>, O> TryFrom<Vector<'buf, T>> for alloc::vec::Vec<O>
10where
11    O: core::convert::TryFrom<T>,
12    errors::Error: From<O::Error>,
13{
14    type Error = crate::errors::Error;
15
16    fn try_from(value: Vector<'buf, T>) -> Result<Self, Self::Error> {
17        value
18            .iter()
19            .map(|v| O::try_from(v).map_err(errors::Error::from))
20            .collect()
21    }
22    /*
23    type Value = ;
24    type Error = crate::errors::Error;
25
26    fn to_owned(self) -> core::result::Result<Self::Value, Error> {
27        self.iter().map(|v| v.to_owned()).collect()
28    } */
29}
30
31impl<'buf, T: ?Sized + VectorRead<'buf>> TableRead<'buf> for Vector<'buf, T> {
32    fn from_buffer(
33        buffer: SliceWithStartOffset<'buf>,
34        offset: usize,
35    ) -> core::result::Result<Self, ErrorKind> {
36        let (buffer, len) = super::array_from_buffer(buffer, offset)?;
37        if len.checked_mul(T::STRIDE).ok_or(ErrorKind::InvalidLength)? <= buffer.len() {
38            Ok(Vector {
39                buffer,
40                len,
41                _marker: PhantomData,
42            })
43        } else {
44            Err(ErrorKind::InvalidLength)
45        }
46    }
47}