use crate::{ config, de::{Decodable, Decode}, enc::{self, Encode, Encodeable}, error::{DecodeError, EncodeError}, Config, }; use alloc::{boxed::Box, vec::Vec}; #[derive(Default)] struct VecWriter { inner: Vec, } impl enc::write::Writer for VecWriter { fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> { self.inner.extend_from_slice(bytes); Ok(()) } } /// Encode the given value into a `Vec`. pub fn encode_to_vec(val: E) -> Result, EncodeError> { encode_to_vec_with_config(val, config::Default) } /// Encode the given value into a `Vec` with the given `Config`. See the [config] module for more information. pub fn encode_to_vec_with_config( val: E, config: C, ) -> Result, EncodeError> { let writer = VecWriter::default(); let mut encoder = enc::Encoder::<_, C>::new(writer, config); val.encode(&mut encoder)?; Ok(encoder.into_writer().inner) } impl<'de, T> Decodable for Vec where T: Decodable, { fn decode(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; let mut vec = Vec::with_capacity(len); for _ in 0..len { vec.push(T::decode(&mut decoder)?); } Ok(vec) } } impl Encodeable for Vec where T: Encodeable, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } } impl<'de, T> Decodable for Box where T: Decodable, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Box::new(t)) } } impl Encodeable for Box where T: Encodeable, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } } impl<'de, T> Decodable for Box<[T]> where T: Decodable, { fn decode(decoder: D) -> Result { let vec = Vec::decode(decoder)?; Ok(vec.into_boxed_slice()) } } impl Encodeable for Box<[T]> where T: Encodeable, { fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { self.len().encode(&mut encoder)?; for item in self.iter() { item.encode(&mut encoder)?; } Ok(()) } }