use super::{BorrowDecodable, BorrowDecode, Decodable, Decode}; use crate::error::{DecodeError, IntegerType}; use core::{ cell::{Cell, RefCell}, num::{ NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, }, ops::{Bound, Range, RangeInclusive}, time::Duration, }; impl Decodable for bool { fn decode(mut decoder: D) -> Result { match decoder.decode_u8()? { 0 => Ok(false), 1 => Ok(true), x => Err(DecodeError::InvalidBooleanValue(x)), } } } impl Decodable for u8 { fn decode(mut decoder: D) -> Result { decoder.decode_u8() } } impl Decodable for NonZeroU8 { fn decode(mut decoder: D) -> Result { NonZeroU8::new(decoder.decode_u8()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::U8, }) } } impl Decodable for u16 { fn decode(mut decoder: D) -> Result { decoder.decode_u16() } } impl Decodable for NonZeroU16 { fn decode(mut decoder: D) -> Result { NonZeroU16::new(decoder.decode_u16()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::U16, }) } } impl Decodable for u32 { fn decode(mut decoder: D) -> Result { decoder.decode_u32() } } impl Decodable for NonZeroU32 { fn decode(mut decoder: D) -> Result { NonZeroU32::new(decoder.decode_u32()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::U32, }) } } impl Decodable for u64 { fn decode(mut decoder: D) -> Result { decoder.decode_u64() } } impl Decodable for NonZeroU64 { fn decode(mut decoder: D) -> Result { NonZeroU64::new(decoder.decode_u64()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::U64, }) } } impl Decodable for u128 { fn decode(mut decoder: D) -> Result { decoder.decode_u128() } } impl Decodable for NonZeroU128 { fn decode(mut decoder: D) -> Result { NonZeroU128::new(decoder.decode_u128()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::U128, }) } } impl Decodable for usize { fn decode(mut decoder: D) -> Result { decoder.decode_usize() } } impl Decodable for NonZeroUsize { fn decode(mut decoder: D) -> Result { NonZeroUsize::new(decoder.decode_usize()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::Usize, }) } } impl Decodable for i8 { fn decode(mut decoder: D) -> Result { decoder.decode_i8() } } impl Decodable for NonZeroI8 { fn decode(mut decoder: D) -> Result { NonZeroI8::new(decoder.decode_i8()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::I8, }) } } impl Decodable for i16 { fn decode(mut decoder: D) -> Result { decoder.decode_i16() } } impl Decodable for NonZeroI16 { fn decode(mut decoder: D) -> Result { NonZeroI16::new(decoder.decode_i16()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::I16, }) } } impl Decodable for i32 { fn decode(mut decoder: D) -> Result { decoder.decode_i32() } } impl Decodable for NonZeroI32 { fn decode(mut decoder: D) -> Result { NonZeroI32::new(decoder.decode_i32()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::I32, }) } } impl Decodable for i64 { fn decode(mut decoder: D) -> Result { decoder.decode_i64() } } impl Decodable for NonZeroI64 { fn decode(mut decoder: D) -> Result { NonZeroI64::new(decoder.decode_i64()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::I64, }) } } impl Decodable for i128 { fn decode(mut decoder: D) -> Result { decoder.decode_i128() } } impl Decodable for NonZeroI128 { fn decode(mut decoder: D) -> Result { NonZeroI128::new(decoder.decode_i128()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::I128, }) } } impl Decodable for isize { fn decode(mut decoder: D) -> Result { decoder.decode_isize() } } impl Decodable for NonZeroIsize { fn decode(mut decoder: D) -> Result { NonZeroIsize::new(decoder.decode_isize()?).ok_or(DecodeError::NonZeroTypeIsZero { non_zero_type: IntegerType::Isize, }) } } impl Decodable for f32 { fn decode(mut decoder: D) -> Result { decoder.decode_f32() } } impl Decodable for f64 { fn decode(mut decoder: D) -> Result { decoder.decode_f64() } } impl Decodable for char { fn decode(mut decoder: D) -> Result { decoder.decode_char() } } impl<'a, 'de: 'a> BorrowDecodable<'de> for &'a [u8] { fn borrow_decode>(mut decoder: D) -> Result { let len = usize::decode(&mut decoder)?; decoder.decode_slice(len) } } impl<'a, 'de: 'a> BorrowDecodable<'de> for &'a str { fn borrow_decode>(decoder: D) -> Result { let slice: &[u8] = BorrowDecodable::borrow_decode(decoder)?; core::str::from_utf8(slice).map_err(DecodeError::Utf8) } } impl Decodable for [u8; N] { fn decode(mut decoder: D) -> Result { decoder.decode_array() } } impl Decodable for core::marker::PhantomData { fn decode(_: D) -> Result { Ok(core::marker::PhantomData) } } impl Decodable for Option where T: Decodable, { fn decode(mut decoder: D) -> Result { let is_some = u8::decode(&mut decoder)?; match is_some { 0 => Ok(None), 1 => { let val = T::decode(decoder)?; Ok(Some(val)) } x => Err(DecodeError::UnexpectedVariant { found: x as u32, max: 1, min: 0, type_name: core::any::type_name::>(), }), } } } impl Decodable for Result where T: Decodable, U: Decodable, { fn decode(mut decoder: D) -> Result { let is_ok = u8::decode(&mut decoder)?; match is_ok { 0 => { let t = T::decode(decoder)?; Ok(Ok(t)) } 1 => { let u = U::decode(decoder)?; Ok(Err(u)) } x => Err(DecodeError::UnexpectedVariant { found: x as u32, max: 1, min: 0, type_name: core::any::type_name::>(), }), } } } impl Decodable for Cell where T: Decodable, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(Cell::new(t)) } } impl Decodable for RefCell where T: Decodable, { fn decode(decoder: D) -> Result { let t = T::decode(decoder)?; Ok(RefCell::new(t)) } } impl Decodable for Duration { fn decode(mut decoder: D) -> Result { let secs = Decodable::decode(&mut decoder)?; let nanos = Decodable::decode(&mut decoder)?; Ok(Duration::new(secs, nanos)) } } impl Decodable for Range where T: Decodable, { fn decode(mut decoder: D) -> Result { let min = T::decode(&mut decoder)?; let max = T::decode(&mut decoder)?; Ok(min..max) } } impl Decodable for RangeInclusive where T: Decodable, { fn decode(mut decoder: D) -> Result { let min = T::decode(&mut decoder)?; let max = T::decode(&mut decoder)?; Ok(RangeInclusive::new(min, max)) } } impl Decodable for Bound where T: Decodable, { fn decode(mut decoder: D) -> Result { match u32::decode(&mut decoder)? { 0 => Ok(Bound::Unbounded), 1 => Ok(Bound::Included(T::decode(decoder)?)), 2 => Ok(Bound::Excluded(T::decode(decoder)?)), x => Err(DecodeError::UnexpectedVariant { min: 0, max: 2, found: x, type_name: core::any::type_name::>(), }), } } } impl<'a, 'de, T> Decode for &'a mut T where T: Decode, { fn decode_u8(&mut self) -> Result { T::decode_u8(self) } fn decode_u16(&mut self) -> Result { T::decode_u16(self) } fn decode_u32(&mut self) -> Result { T::decode_u32(self) } fn decode_u64(&mut self) -> Result { T::decode_u64(self) } fn decode_u128(&mut self) -> Result { T::decode_u128(self) } fn decode_usize(&mut self) -> Result { T::decode_usize(self) } fn decode_i8(&mut self) -> Result { T::decode_i8(self) } fn decode_i16(&mut self) -> Result { T::decode_i16(self) } fn decode_i32(&mut self) -> Result { T::decode_i32(self) } fn decode_i64(&mut self) -> Result { T::decode_i64(self) } fn decode_i128(&mut self) -> Result { T::decode_i128(self) } fn decode_isize(&mut self) -> Result { T::decode_isize(self) } fn decode_f32(&mut self) -> Result { T::decode_f32(self) } fn decode_f64(&mut self) -> Result { T::decode_f64(self) } fn decode_array(&mut self) -> Result<[u8; N], DecodeError> { T::decode_array::(self) } fn decode_char(&mut self) -> Result { T::decode_char(self) } } impl<'a, 'de, T> BorrowDecode<'de> for &'a mut T where T: BorrowDecode<'de>, { fn decode_slice(&mut self, len: usize) -> Result<&'de [u8], DecodeError> { T::decode_slice(self, len) } }