use crate::{
de::{read::Reader, BorrowDecode, BorrowDecoder, BorrowReader, Decode, Decoder},
enc::{write::Writer, Encode, Encoder},
error::Error,
};
use alloc::{
borrow::{Cow, ToOwned},
boxed::Box,
collections::{BTreeMap, BTreeSet, BinaryHeap, LinkedList, VecDeque},
rc::Rc,
string::String,
sync::Arc,
vec::Vec,
};
impl<T: Encode> Encode for Vec<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for item in self.iter() {
item.encode(encoder)?;
}
Ok(())
}
}
impl<T: Decode> Decode for Vec<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
decoder.claim_container_read::<T>(len)?;
let mut vec = Vec::with_capacity(len);
for _ in 0..len {
vec.push(T::decode(decoder)?);
}
Ok(vec)
}
}
impl Encode for String {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
self.as_str().encode(encoder)
}
}
impl Encode for str {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
encoder.writer().write(self.as_bytes())
}
}
impl Encode for &str {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(*self).encode(encoder)
}
}
impl Encode for &[u8] {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
encoder.writer().write(self)
}
}
impl Decode for String {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
decoder.claim_bytes_read(len)?;
let mut bytes = alloc::vec![0u8; len];
decoder.reader().read(&mut bytes)?;
String::from_utf8(bytes).map_err(|e| Error::Utf8 {
inner: e.utf8_error(),
})
}
}
impl<T: Encode> Encode for Box<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Box<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Box::new(T::decode(decoder)?))
}
}
impl<T: Encode> Encode for Box<[T]> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Box<[T]> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let vec = Vec::<T>::decode(decoder)?;
Ok(vec.into_boxed_slice())
}
}
impl Encode for Box<str> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl Decode for Box<str> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let string = String::decode(decoder)?;
Ok(string.into_boxed_str())
}
}
impl<T: Encode + ToOwned + ?Sized> Encode for Cow<'_, T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<'a, T> Decode for Cow<'a, T>
where
T: ToOwned,
T::Owned: Decode,
{
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Cow::Owned(T::Owned::decode(decoder)?))
}
}
impl Decode for Cow<'_, str> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Cow::Owned(String::decode(decoder)?))
}
}
impl Decode for Cow<'_, [u8]> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Cow::Owned(Vec::<u8>::decode(decoder)?))
}
}
impl<'de> BorrowDecode<'de> for Cow<'de, str> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Cow::Borrowed(<&'de str>::borrow_decode(decoder)?))
}
}
impl<'de> BorrowDecode<'de> for Cow<'de, [u8]> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Cow::Borrowed(<&'de [u8]>::borrow_decode(decoder)?))
}
}
impl<T: Encode> Encode for Rc<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Rc<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Rc::new(T::decode(decoder)?))
}
}
impl<T: Encode> Encode for Rc<[T]> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Rc<[T]> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let vec = Vec::<T>::decode(decoder)?;
Ok(Rc::from(vec.into_boxed_slice()))
}
}
impl Encode for Rc<str> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl Decode for Rc<str> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let string = String::decode(decoder)?;
Ok(Rc::from(string.into_boxed_str()))
}
}
impl<T: Encode> Encode for Arc<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Arc<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Ok(Arc::new(T::decode(decoder)?))
}
}
impl<T: Encode> Encode for Arc<[T]> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl<T: Decode> Decode for Arc<[T]> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let vec = Vec::<T>::decode(decoder)?;
Ok(Arc::from(vec.into_boxed_slice()))
}
}
impl Encode for Arc<str> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(**self).encode(encoder)
}
}
impl Decode for Arc<str> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let string = String::decode(decoder)?;
Ok(Arc::from(string.into_boxed_str()))
}
}
impl<K: Encode, V: Encode> Encode for BTreeMap<K, V> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for (key, value) in self.iter() {
key.encode(encoder)?;
value.encode(encoder)?;
}
Ok(())
}
}
impl<K, V> Decode for BTreeMap<K, V>
where
K: Decode + Ord,
V: Decode,
{
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
let mut map = BTreeMap::new();
for _ in 0..len {
let key = K::decode(decoder)?;
let value = V::decode(decoder)?;
map.insert(key, value);
}
Ok(map)
}
}
impl<T: Encode> Encode for BTreeSet<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for item in self.iter() {
item.encode(encoder)?;
}
Ok(())
}
}
impl<T> Decode for BTreeSet<T>
where
T: Decode + Ord,
{
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
let mut set = BTreeSet::new();
for _ in 0..len {
set.insert(T::decode(decoder)?);
}
Ok(set)
}
}
impl<T: Encode> Encode for BinaryHeap<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for item in self.iter() {
item.encode(encoder)?;
}
Ok(())
}
}
impl<T> Decode for BinaryHeap<T>
where
T: Decode + Ord,
{
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
let mut heap = BinaryHeap::with_capacity(len);
for _ in 0..len {
heap.push(T::decode(decoder)?);
}
Ok(heap)
}
}
impl<T: Encode> Encode for VecDeque<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for item in self.iter() {
item.encode(encoder)?;
}
Ok(())
}
}
impl<T: Decode> Decode for VecDeque<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
let mut deque = VecDeque::with_capacity(len);
for _ in 0..len {
deque.push_back(T::decode(decoder)?);
}
Ok(deque)
}
}
impl<T: Encode> Encode for LinkedList<T> {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), Error> {
(self.len() as u64).encode(encoder)?;
for item in self.iter() {
item.encode(encoder)?;
}
Ok(())
}
}
impl<T: Decode> Decode for LinkedList<T> {
fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
let mut list = LinkedList::new();
for _ in 0..len {
list.push_back(T::decode(decoder)?);
}
Ok(list)
}
}
crate::impl_borrow_decode!(String);
impl<'de, T: Decode + Ord + 'static> BorrowDecode<'de> for BinaryHeap<T> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
BinaryHeap::<T>::decode(decoder)
}
}
impl<'de, K: Decode + Ord + 'static, V: Decode + 'static> BorrowDecode<'de> for BTreeMap<K, V> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
BTreeMap::<K, V>::decode(decoder)
}
}
impl<'de, T: Decode + Ord + 'static> BorrowDecode<'de> for BTreeSet<T> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
BTreeSet::<T>::decode(decoder)
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for VecDeque<T> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
VecDeque::<T>::decode(decoder)
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for LinkedList<T> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
LinkedList::<T>::decode(decoder)
}
}
impl<'de, T> BorrowDecode<'de> for alloc::vec::Vec<T>
where
T: BorrowDecode<'de>,
{
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let len = u64::decode(decoder)? as usize;
decoder.claim_container_read::<T>(len)?;
let mut vec = alloc::vec::Vec::with_capacity(len);
for _ in 0..len {
vec.push(T::borrow_decode(decoder)?);
}
Ok(vec)
}
}
impl<'de, T> BorrowDecode<'de> for Option<T>
where
T: BorrowDecode<'de>,
{
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
let variant = u8::decode(decoder)?;
match variant {
0 => Ok(None),
1 => Ok(Some(T::borrow_decode(decoder)?)),
_ => Err(Error::InvalidData {
message: "Invalid Option variant",
}),
}
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for alloc::boxed::Box<T> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Box::<T>::decode(decoder)
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for alloc::boxed::Box<[T]> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Box::<[T]>::decode(decoder)
}
}
impl<'de> BorrowDecode<'de> for alloc::boxed::Box<str> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Box::<str>::decode(decoder)
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for alloc::sync::Arc<[T]> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Arc::<[T]>::decode(decoder)
}
}
impl<'de> BorrowDecode<'de> for alloc::sync::Arc<str> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Arc::<str>::decode(decoder)
}
}
impl<'de, T: Decode + 'static> BorrowDecode<'de> for alloc::rc::Rc<[T]> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Rc::<[T]>::decode(decoder)
}
}
impl<'de> BorrowDecode<'de> for alloc::rc::Rc<str> {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
Rc::<str>::decode(decoder)
}
}
impl<'de> BorrowDecode<'de> for &'de [u8] {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
use crate::de::Decode;
let len = u64::decode(decoder)? as usize;
decoder.claim_bytes_read(len)?;
let bytes = decoder.borrow_reader().take_bytes(len)?;
Ok(bytes)
}
}
impl<'de> BorrowDecode<'de> for &'de str {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
use crate::de::Decode;
let len = u64::decode(decoder)? as usize;
decoder.claim_bytes_read(len)?;
let bytes = decoder.borrow_reader().take_bytes(len)?;
core::str::from_utf8(bytes).map_err(|e| Error::Utf8 { inner: e })
}
}
impl<'de> BorrowDecode<'de> for &'de [i8] {
fn borrow_decode<D: BorrowDecoder<'de, Context = ()>>(decoder: &mut D) -> Result<Self, Error> {
use crate::de::Decode;
let len = u64::decode(decoder)? as usize;
decoder.claim_bytes_read(len)?;
let bytes: &'de [u8] = decoder.borrow_reader().take_bytes(len)?;
let signed_bytes: &'de [i8] =
unsafe { core::slice::from_raw_parts(bytes.as_ptr() as *const i8, bytes.len()) };
Ok(signed_bytes)
}
}