use crate::{ config, de::{Decodable, Decode}, enc::{self, Encode, Encodeable}, error::{DecodeError, EncodeError}, Config, }; use alloc::{borrow::Cow, boxed::Box, rc::Rc, sync::Arc, 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 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 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 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(()) } } impl<'cow, T> Decodable for Cow<'cow, T> where T: Decodable + Clone, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Cow::Owned(t)) } } impl<'cow, T> Encodeable for Cow<'cow, T> where T: Encodeable + Clone, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { self.as_ref().encode(encoder) } } impl Decodable for Rc where T: Decodable, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Rc::new(t)) } } impl Encodeable for Rc where T: Encodeable, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } } impl Decodable for Arc where T: Decodable, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Arc::new(t)) } } impl Encodeable for Arc where T: Encodeable, { fn encode(&self, encoder: E) -> Result<(), EncodeError> { T::encode(self, encoder) } }