Trait Decode

Source
pub trait Decode {
    type Item;

    // Required methods
    fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize>;
    fn finish_decoding(&mut self) -> Result<Self::Item>;
    fn requiring_bytes(&self) -> ByteCount;

    // Provided method
    fn is_idle(&self) -> bool { ... }
}
Expand description

This trait allows for decoding items from a byte sequence incrementally.

Required Associated Types§

Source

type Item

The type of items to be decoded.

Required Methods§

Source

fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize>

Consumes the given buffer (a part of a byte sequence), and proceeds the decoding process.

It returns the number of bytes consumed from the input buffer.

If an item is completely decoded, the next invocation of is_idle method will return true. And if is_idle method returns true, decode method should consume no bytes.

The decoder must consume as many bytes in the buffer as possible. If an item is not yet decoded but the number of consumed bytes in the last decode invocation is smaller than the length of buf, it means the decoder has been suspended its work in any reasons. In that case the decoder may require some instructions from clients to resume the work, but its concrete method is beyond the scope of this trait.

§Errors

The following errors may be returned by the decoder:

  • ErrorKind::DecoderTerminated:
    • If all decodable items have been decoded, the decoder must return this kind of error when decode method is called.
  • ErrorKind::UnexpectedEos:
    • The invocation of eos.is_reached() returns true despite of the decoder requires more bytes to decode the next item.
  • ErrorKind::InvalidInput:
    • Decoded items have invalid values
    • Invalid parameters were given to decoders
  • ErrorKind::InconsistentState:
    • The state of the decoder bocame inconsistent
    • This means the implementation contains a bug
  • ErrorKind::Other:
    • Other errors
Source

fn finish_decoding(&mut self) -> Result<Self::Item>

Finishes the current decoding process and returns the decoded item.

§Errors

The following errors may be returned by the decoder:

  • ErrorKind::IncompleteDecoding:
    • The decoding process has not been completed
  • ErrorKind::DecoderTerminated:
    • The decoder has terminated (i.e., cannot decode any more items)
  • ErrorKind::InconsistentState:
    • The state of the decoder bocame inconsistent
    • This means the implementation contains a bug
  • ErrorKind::Other:
    • Other errors
Source

fn requiring_bytes(&self) -> ByteCount

Returns the lower bound of the number of bytes needed to decode the next item.

If the decoder does not know the value, it will return ByteCount::Unknown (e.g., null-terminated strings have no pre-estimable length).

If the decoder returns ByteCount::Finite(0), it means one of the followings:

  • (a) There is an already decoded item
    • The next invocation of decode() will return it without consuming any bytes
  • (b) There are no decodable items
    • All decodable items have been decoded, and the decoder cannot do any further works
    • In this case, the next invocation of decode method will fail.

Provided Methods§

Source

fn is_idle(&self) -> bool

Returns true if there are no items to be decoded by the decoder at the next invocation of decode method, otherwise false.

Typically, true means the decoder already has a decoded item and it is waiting for finish_decoding to be called.

The default implementation returns the result of self.requiring_bytes() == ByteCount::Finite(0).

Implementations on Foreign Types§

Source§

impl<D: ?Sized + Decode> Decode for &mut D

Source§

type Item = <D as Decode>::Item

Source§

fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize>

Source§

fn finish_decoding(&mut self) -> Result<Self::Item>

Source§

fn requiring_bytes(&self) -> ByteCount

Source§

fn is_idle(&self) -> bool

Source§

impl<D: ?Sized + Decode> Decode for Box<D>

Source§

type Item = <D as Decode>::Item

Source§

fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize>

Source§

fn finish_decoding(&mut self) -> Result<Self::Item>

Source§

fn requiring_bytes(&self) -> ByteCount

Source§

fn is_idle(&self) -> bool

Implementors§

Source§

impl Decode for RemainingBytesDecoder

Source§

impl Decode for F32beDecoder

Source§

impl Decode for F32leDecoder

Source§

impl Decode for F64beDecoder

Source§

impl Decode for F64leDecoder

Source§

impl Decode for I8Decoder

Source§

impl Decode for I16beDecoder

Source§

impl Decode for I16leDecoder

Source§

impl Decode for I32beDecoder

Source§

impl Decode for I32leDecoder

Source§

impl Decode for I64beDecoder

Source§

impl Decode for I64leDecoder

Source§

impl Decode for U8Decoder

Source§

impl Decode for U16beDecoder

Source§

impl Decode for U16leDecoder

Source§

impl Decode for U24beDecoder

Source§

impl Decode for U24leDecoder

Source§

impl Decode for U32beDecoder

Source§

impl Decode for U32leDecoder

Source§

impl Decode for U40beDecoder

Source§

impl Decode for U40leDecoder

Source§

impl Decode for U48beDecoder

Source§

impl Decode for U48leDecoder

Source§

impl Decode for U56beDecoder

Source§

impl Decode for U56leDecoder

Source§

impl Decode for U64beDecoder

Source§

impl Decode for U64leDecoder

Source§

impl Decode for NullDecoder

Source§

impl Decode for PaddingDecoder

Source§

impl<B: AsRef<[u8]> + AsMut<[u8]> + Copy> Decode for CopyableBytesDecoder<B>

Source§

type Item = B

Source§

impl<B: AsRef<[u8]> + AsMut<[u8]>> Decode for BytesDecoder<B>

Source§

type Item = B

Source§

impl<D0, D1> Decode for TupleDecoder<(D0, D1)>
where D0: Decode, D1: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item)

Source§

impl<D0, D1, D2> Decode for TupleDecoder<(D0, D1, D2)>
where D0: Decode, D1: Decode, D2: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item)

Source§

impl<D0, D1, D2, D3> Decode for TupleDecoder<(D0, D1, D2, D3)>
where D0: Decode, D1: Decode, D2: Decode, D3: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item, <D3 as Decode>::Item)

Source§

impl<D0, D1, D2, D3, D4> Decode for TupleDecoder<(D0, D1, D2, D3, D4)>
where D0: Decode, D1: Decode, D2: Decode, D3: Decode, D4: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item, <D3 as Decode>::Item, <D4 as Decode>::Item)

Source§

impl<D0, D1, D2, D3, D4, D5> Decode for TupleDecoder<(D0, D1, D2, D3, D4, D5)>
where D0: Decode, D1: Decode, D2: Decode, D3: Decode, D4: Decode, D5: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item, <D3 as Decode>::Item, <D4 as Decode>::Item, <D5 as Decode>::Item)

Source§

impl<D0, D1, D2, D3, D4, D5, D6> Decode for TupleDecoder<(D0, D1, D2, D3, D4, D5, D6)>
where D0: Decode, D1: Decode, D2: Decode, D3: Decode, D4: Decode, D5: Decode, D6: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item, <D3 as Decode>::Item, <D4 as Decode>::Item, <D5 as Decode>::Item, <D6 as Decode>::Item)

Source§

impl<D0, D1, D2, D3, D4, D5, D6, D7> Decode for TupleDecoder<(D0, D1, D2, D3, D4, D5, D6, D7)>
where D0: Decode, D1: Decode, D2: Decode, D3: Decode, D4: Decode, D5: Decode, D6: Decode, D7: Decode,

Source§

type Item = (<D0 as Decode>::Item, <D1 as Decode>::Item, <D2 as Decode>::Item, <D3 as Decode>::Item, <D4 as Decode>::Item, <D5 as Decode>::Item, <D6 as Decode>::Item, <D7 as Decode>::Item)

Source§

impl<D0, D1, F> Decode for AndThen<D0, D1, F>
where D0: Decode, D1: Decode, F: Fn(D0::Item) -> D1,

Source§

type Item = <D1 as Decode>::Item

Source§

impl<D> Decode for Utf8Decoder<D>
where D: Decode<Item = Vec<u8>>,

Source§

impl<D, E, F> Decode for MapErr<D, E, F>
where D: Decode, F: Fn(Error) -> E, Error: From<E>,

Source§

type Item = <D as Decode>::Item

Source§

impl<D, T> Decode for Collect<D, T>
where D: Decode, T: Extend<D::Item> + Default,

Source§

type Item = T

Source§

impl<D, T> Decode for CollectN<D, T>
where D: Decode, T: Default + Extend<D::Item>,

Source§

type Item = T

Source§

impl<D, T, E, F> Decode for TryMap<D, T, E, F>
where D: Decode, F: Fn(D::Item) -> Result<T, E>, Error: From<E>,

Source§

type Item = T

Source§

impl<D, T, F> Decode for Map<D, T, F>
where D: Decode, F: Fn(D::Item) -> T,

Source§

type Item = T

Source§

impl<D: MonolithicDecode> Decode for MonolithicDecoder<D>

Source§

impl<D: Decode> Decode for Length<D>

Source§

type Item = <D as Decode>::Item

Source§

impl<D: Decode> Decode for MaxBytes<D>

Source§

type Item = <D as Decode>::Item

Source§

impl<D: Decode> Decode for MaybeEos<D>

Source§

type Item = <D as Decode>::Item

Source§

impl<D: Decode> Decode for Omittable<D>

Source§

type Item = Option<<D as Decode>::Item>

Source§

impl<D: Decode> Decode for Peekable<D>

Source§

type Item = <D as Decode>::Item

Source§

impl<D: Decode> Decode for Slice<D>

Source§

type Item = <D as Decode>::Item

Source§

impl<T> Decode for BincodeDecoder<T>
where T: for<'de> Deserialize<'de>,

Source§

type Item = T

Source§

impl<T> Decode for JsonDecoder<T>
where T: for<'de> Deserialize<'de>,

Source§

type Item = T