Skip to main content

Decoder

Trait Decoder 

Source
pub trait Decoder: Sealed + BincodeErrorPathCovered<0> {
    type R: Reader;
    type C: Config;
    type Context;

Show 30 methods // Required methods fn context(&mut self) -> &mut Self::Context; fn reader(&mut self) -> &mut Self::R; fn config(&self) -> &Self::C; fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError>; fn unclaim_bytes_read(&mut self, n: usize); // Provided methods fn with_context<C>(&mut self, context: C) -> WithContext<'_, Self, C> { ... } fn claim_container_read<T>(&mut self, len: usize) -> Result<(), DecodeError> { ... } fn decode_u8(&mut self) -> Result<u8, DecodeError> { ... } fn decode_u16(&mut self) -> Result<u16, DecodeError> { ... } fn decode_u32(&mut self) -> Result<u32, DecodeError> { ... } fn decode_u64(&mut self) -> Result<u64, DecodeError> { ... } fn decode_u128(&mut self) -> Result<u128, DecodeError> { ... } fn decode_usize(&mut self) -> Result<usize, DecodeError> { ... } fn decode_i8(&mut self) -> Result<i8, DecodeError> { ... } fn decode_i16(&mut self) -> Result<i16, DecodeError> { ... } fn decode_i32(&mut self) -> Result<i32, DecodeError> { ... } fn decode_i64(&mut self) -> Result<i64, DecodeError> { ... } fn decode_i128(&mut self) -> Result<i128, DecodeError> { ... } fn decode_isize(&mut self) -> Result<isize, DecodeError> { ... } fn decode_f32(&mut self) -> Result<f32, DecodeError> { ... } fn decode_f64(&mut self) -> Result<f64, DecodeError> { ... } fn decode_bool(&mut self) -> Result<bool, DecodeError> { ... } fn decode_slice_len(&mut self) -> Result<usize, DecodeError> { ... } fn decode_array_len(&mut self) -> Result<usize, DecodeError> { ... } fn decode_map_len(&mut self) -> Result<usize, DecodeError> { ... } fn decode_variant_index(&mut self) -> Result<u32, DecodeError> { ... } fn decode_byte_slice_len(&mut self) -> Result<usize, DecodeError> { ... } fn decode_byte_slice_or_array_len( &mut self, ) -> Result<(u8, usize), DecodeError> { ... } fn decode_str_len(&mut self) -> Result<usize, DecodeError> { ... } fn decode_struct_header(&mut self, _len: usize) -> Result<(), DecodeError> { ... }
}
Expand description

Any source that can decode basic types. This type is most notably implemented for Decoder.

Required Associated Types§

Source

type R: Reader

The concrete Reader type

Source

type C: Config

The concrete Config type

Source

type Context

The decoding context type

Required Methods§

Source

fn context(&mut self) -> &mut Self::Context

Returns the decoding context

Source

fn reader(&mut self) -> &mut Self::R

Returns a mutable reference to the reader

Source

fn config(&self) -> &Self::C

Returns a reference to the config

Source

fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError>

Claim that n bytes are going to be read from the decoder. This can be used to validate Configuration::Limit<N>().

§Errors

Returns DecodeError::LimitExceeded if the limit is exceeded.

Source

fn unclaim_bytes_read(&mut self, n: usize)

Notify the decoder that n bytes are being reclaimed.

When decoding container types, a typical implementation would claim to read len * size_of::<T>() bytes. This is to ensure that bincode won’t allocate several GB of memory while constructing the container.

Because the implementation claims len * size_of::<T>(), but then has to decode each T, this would be marked as double. This function allows us to un-claim each T that gets decoded.

We cannot check if len * size_of::<T>() is valid without claiming it, because this would mean that if you have a nested container (e.g. Vec<Vec<T>>), it does not know how much memory is already claimed, and could easily allocate much more than the user intends.


impl<Context, T: Decode<Context>> Decode<Context> for Container<T> {
    fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
        let len = u64::decode(decoder)?;
        let len: usize = len
            .try_into()
            .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
        // Make sure we don't allocate too much memory
        decoder.claim_bytes_read(len * core::mem::size_of::<T>());

        let mut result = Container::with_capacity(len);
        for _ in 0..len {
            // un-claim the memory
            decoder.unclaim_bytes_read(core::mem::size_of::<T>());
            result.push(T::decode(decoder)?)
        }
        Ok(result)
    }
}
impl<'de, Context, T: bincode_next::BorrowDecode<'de, Context>>
    bincode_next::BorrowDecode<'de, Context> for Container<T>
{
    fn borrow_decode<D: bincode_next::de::BorrowDecoder<'de, Context = Context>>(
        decoder: &mut D
    ) -> core::result::Result<Self, bincode_next::error::DecodeError> {
        let len = u64::borrow_decode(decoder)?;
        let len: usize = len
            .try_into()
            .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
        // Make sure we don't allocate too much memory
        decoder.claim_bytes_read(len * core::mem::size_of::<T>());

        let mut result = Container::with_capacity(len);
        for _ in 0..len {
            // un-claim the memory
            decoder.unclaim_bytes_read(core::mem::size_of::<T>());
            result.push(T::borrow_decode(decoder)?)
        }
        Ok(result)
    }
}

Provided Methods§

Source

fn with_context<C>(&mut self, context: C) -> WithContext<'_, Self, C>

Wraps decoder with a context

Source

fn claim_container_read<T>(&mut self, len: usize) -> Result<(), DecodeError>

Claim that we’re going to read a container which contains len entries of T. This will correctly handle overflowing if len * size_of::<T>() > usize::max_value

§Errors

Returns DecodeError::LimitExceeded if the limit is exceeded or if len * size_of::<T>() overflows.

Source

fn decode_u8(&mut self) -> Result<u8, DecodeError>

Decode a u8 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_u16(&mut self) -> Result<u16, DecodeError>

Decode a u16 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_u32(&mut self) -> Result<u32, DecodeError>

Decode a u32 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_u64(&mut self) -> Result<u64, DecodeError>

Decode a u64 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_u128(&mut self) -> Result<u128, DecodeError>

Decode a u128 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_usize(&mut self) -> Result<usize, DecodeError>

Decode a usize value.

§Errors

Returns an error if the operation fails.

Source

fn decode_i8(&mut self) -> Result<i8, DecodeError>

Decode an i8 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_i16(&mut self) -> Result<i16, DecodeError>

Decode an i16 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_i32(&mut self) -> Result<i32, DecodeError>

Decode an i32 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_i64(&mut self) -> Result<i64, DecodeError>

Decode an i64 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_i128(&mut self) -> Result<i128, DecodeError>

Decode an i128 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_isize(&mut self) -> Result<isize, DecodeError>

Decode an isize value.

§Errors

Returns an error if the operation fails.

Source

fn decode_f32(&mut self) -> Result<f32, DecodeError>

Decode an f32 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_f64(&mut self) -> Result<f64, DecodeError>

Decode an f64 value.

§Errors

Returns an error if the operation fails.

Source

fn decode_bool(&mut self) -> Result<bool, DecodeError>

Decode a bool value.

§Errors

Returns an error if the operation fails.

Source

fn decode_slice_len(&mut self) -> Result<usize, DecodeError>

Decode the length of a slice.

§Errors

Returns an error if the operation fails.

Source

fn decode_array_len(&mut self) -> Result<usize, DecodeError>

Decode the length of an array.

§Errors

Returns an error if the operation fails.

Source

fn decode_map_len(&mut self) -> Result<usize, DecodeError>

Decode the length of a map.

§Errors

Returns an error if the operation fails.

Source

fn decode_variant_index(&mut self) -> Result<u32, DecodeError>

Decode an enum variant index.

§Errors

Returns DecodeError if the encoding fails.

Source

fn decode_byte_slice_len(&mut self) -> Result<usize, DecodeError>

Decode the length of a byte slice (Major Type 2 in CBOR).

§Errors

Returns DecodeError if the encoding fails.

Source

fn decode_byte_slice_or_array_len(&mut self) -> Result<(u8, usize), DecodeError>

Decode the length of a byte slice or an array (Major Type 2 or 4 in CBOR).

§Errors

Returns DecodeError if the encoding fails.

Source

fn decode_str_len(&mut self) -> Result<usize, DecodeError>

Decode the length of a string (Major Type 3 in CBOR).

§Errors

Returns DecodeError if the encoding fails.

Source

fn decode_struct_header(&mut self, _len: usize) -> Result<(), DecodeError>

Decode the header for a struct.

§Errors

Returns DecodeError if the encoding fails.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<T> Decoder for &mut T
where T: Decoder,

Source§

type C = <T as Decoder>::C

Source§

type Context = <T as Decoder>::Context

Source§

type R = <T as Decoder>::R

Source§

fn reader(&mut self) -> &mut Self::R

Source§

fn config(&self) -> &Self::C

Source§

fn claim_bytes_read(&mut self, n: usize) -> Result<(), DecodeError>

Source§

fn unclaim_bytes_read(&mut self, n: usize)

Source§

fn context(&mut self) -> &mut Self::Context

Source§

fn decode_u8(&mut self) -> Result<u8, DecodeError>

Source§

fn decode_u16(&mut self) -> Result<u16, DecodeError>

Source§

fn decode_u32(&mut self) -> Result<u32, DecodeError>

Source§

fn decode_u64(&mut self) -> Result<u64, DecodeError>

Source§

fn decode_u128(&mut self) -> Result<u128, DecodeError>

Source§

fn decode_usize(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_i8(&mut self) -> Result<i8, DecodeError>

Source§

fn decode_i16(&mut self) -> Result<i16, DecodeError>

Source§

fn decode_i32(&mut self) -> Result<i32, DecodeError>

Source§

fn decode_i64(&mut self) -> Result<i64, DecodeError>

Source§

fn decode_i128(&mut self) -> Result<i128, DecodeError>

Source§

fn decode_isize(&mut self) -> Result<isize, DecodeError>

Source§

fn decode_f32(&mut self) -> Result<f32, DecodeError>

Source§

fn decode_f64(&mut self) -> Result<f64, DecodeError>

Source§

fn decode_bool(&mut self) -> Result<bool, DecodeError>

Source§

fn decode_slice_len(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_array_len(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_map_len(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_variant_index(&mut self) -> Result<u32, DecodeError>

Source§

fn decode_byte_slice_len(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_str_len(&mut self) -> Result<usize, DecodeError>

Source§

fn decode_struct_header(&mut self, len: usize) -> Result<(), DecodeError>

Implementors§

Source§

impl<R: Reader, C: Config, Context> Decoder for DecoderImpl<R, C, Context>

Source§

type C = C

Source§

type Context = Context

Source§

type R = R