use crate::error::{Error, ErrorCode};
use crate::utils::init::{self, IntoFallibleInit};
use crate::utils::storage::Vec;
use super::{slice::tlv_array_iter, FromTLV, TLVArray, TLVElement, TLVTag, TLVWrite, ToTLV, TLV};
impl<'a, T, const N: usize> FromTLV<'a> for Vec<T, N>
where
T: FromTLV<'a> + 'a,
{
fn from_tlv(element: &TLVElement<'a>) -> Result<Self, Error> {
let mut vec = Vec::<T, N>::new();
for item in TLVArray::new(element.clone())? {
vec.push(item?).map_err(|_| ErrorCode::ConstraintError)?;
}
Ok(vec)
}
fn init_from_tlv(tlv: TLVElement<'a>) -> impl init::Init<Self, Error> {
init::Init::chain(Vec::<T, N>::init().into_fallible(), move |vec| {
let mut iter = TLVArray::new(tlv)?.iter();
while let Some(item) = iter.try_next_init() {
vec.push_init(item?, || ErrorCode::ConstraintError.into())?;
}
Ok(())
})
}
}
impl<T, const N: usize> ToTLV for Vec<T, N>
where
T: ToTLV,
{
fn to_tlv<W: TLVWrite>(&self, tag: &TLVTag, tw: W) -> Result<(), Error> {
self.as_slice().to_tlv(tag, tw)
}
fn tlv_iter(&self, tag: TLVTag) -> impl Iterator<Item = Result<TLV<'_>, Error>> {
tlv_array_iter(tag, self.iter())
}
}
#[cfg(feature = "alloc")]
impl<'a, T> FromTLV<'a> for alloc::vec::Vec<T>
where
T: FromTLV<'a> + 'a,
{
fn from_tlv(element: &TLVElement<'a>) -> Result<Self, Error> {
let mut vec = alloc::vec::Vec::new();
for item in TLVArray::new(element.clone())? {
vec.push(item?);
}
Ok(vec)
}
}
#[cfg(feature = "alloc")]
impl<T> ToTLV for alloc::vec::Vec<T>
where
T: ToTLV,
{
fn to_tlv<W: TLVWrite>(&self, tag: &TLVTag, tw: W) -> Result<(), Error> {
self.as_slice().to_tlv(tag, tw)
}
fn tlv_iter(&self, tag: TLVTag) -> impl Iterator<Item = Result<TLV<'_>, Error>> {
tlv_array_iter(tag, self.iter())
}
}