use super::{BorrowDecodable, BorrowDecode, Decodable, Decode}; use crate::error::DecodeError; impl<'de> 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<'de> Decodable for u8 { fn decode(mut decoder: D) -> Result { decoder.decode_u8() } } impl<'de> Decodable for u16 { fn decode(mut decoder: D) -> Result { decoder.decode_u16() } } impl<'de> Decodable for u32 { fn decode(mut decoder: D) -> Result { decoder.decode_u32() } } impl<'de> Decodable for u64 { fn decode(mut decoder: D) -> Result { decoder.decode_u64() } } impl<'de> Decodable for u128 { fn decode(mut decoder: D) -> Result { decoder.decode_u128() } } impl<'de> Decodable for usize { fn decode(mut decoder: D) -> Result { decoder.decode_usize() } } impl<'de> Decodable for i8 { fn decode(mut decoder: D) -> Result { decoder.decode_i8() } } impl<'de> Decodable for i16 { fn decode(mut decoder: D) -> Result { decoder.decode_i16() } } impl<'de> Decodable for i32 { fn decode(mut decoder: D) -> Result { decoder.decode_i32() } } impl<'de> Decodable for i64 { fn decode(mut decoder: D) -> Result { decoder.decode_i64() } } impl<'de> Decodable for i128 { fn decode(mut decoder: D) -> Result { decoder.decode_i128() } } impl<'de> Decodable for isize { fn decode(mut decoder: D) -> Result { decoder.decode_isize() } } impl<'de> Decodable for f32 { fn decode(mut decoder: D) -> Result { decoder.decode_f32() } } impl<'de> Decodable for f64 { fn decode(mut decoder: D) -> Result { decoder.decode_f64() } } impl<'de> 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<'de, const N: usize> Decodable for [u8; N] { fn decode(mut decoder: D) -> Result { decoder.decode_array() } } impl<'de, T> Decodable for core::marker::PhantomData { fn decode(_: D) -> Result { Ok(core::marker::PhantomData) } } impl<'de, T> 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<'de, T, U> 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<'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) } }