pub struct DecoderBuffer<'a> { /* private fields */ }
Expand description
DecoderBuffer is a panic-free byte buffer for look-ahead decoding untrusted input
Implementations
sourceimpl<'a> DecoderBuffer<'a>
impl<'a> DecoderBuffer<'a>
sourceimpl<'a> DecoderBuffer<'a>
impl<'a> DecoderBuffer<'a>
sourcepub fn decode_slice(
self,
count: usize
) -> DecoderBufferResult<'a, DecoderBuffer<'a>>
pub fn decode_slice(
self,
count: usize
) -> DecoderBufferResult<'a, DecoderBuffer<'a>>
Decode a slice of bytes by count
, removing the slice from the current buffer
let mut data = [0, 1, 2, 3, 4];
let buffer = DecoderBuffer::new(&mut data);
let (slice, buffer) = buffer.decode_slice(5).unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty());
sourcepub fn decode<T: DecoderValue<'a>>(self) -> DecoderBufferResult<'a, T>
pub fn decode<T: DecoderValue<'a>>(self) -> DecoderBufferResult<'a, T>
Decode a value of type T
, splitting the data from the current buffer
let mut data = [0, 1, 2, 3, 4, 5, 6];
let buffer = DecoderBuffer::new(&mut data);
let (value, buffer) = buffer.decode::<u8>().unwrap();
assert_eq!(value, 0);
let (value, buffer) = buffer.decode::<u16>().unwrap();
assert_eq!(value, 258);
let (value, buffer) = buffer.decode::<u32>().unwrap();
assert_eq!(value, 50_595_078);
assert!(buffer.is_empty());
sourcepub fn decode_slice_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self
) -> DecoderBufferResult<'a, Self>
pub fn decode_slice_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self
) -> DecoderBufferResult<'a, Self>
Decode a slice prefixed by type Length
, splitting the data from the
current buffer.
With a Length
as encoded u8
:
let mut data = [5, 0, 1, 2, 3, 4];
let buffer = DecoderBuffer::new(&mut data);
let (slice, buffer) = buffer.decode_slice_with_len_prefix::<u8>().unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty())
With a Length
as encoded u16
:
let mut data = [0, 5, 0, 1, 2, 3, 4];
let buffer = DecoderBuffer::new(&mut data);
let (slice, buffer) = buffer.decode_slice_with_len_prefix::<u16>().unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty())
sourcepub fn decode_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>, T: DecoderValue<'a>>(
self
) -> DecoderBufferResult<'a, T>
pub fn decode_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>, T: DecoderValue<'a>>(
self
) -> DecoderBufferResult<'a, T>
Decode a value of type T
prefixed by type Length
, splitting the data from the
current buffer.
With a Length
as encoded u8
and T
as u16
:
let mut data = [2, 0, 1, 2, 3];
let buffer = DecoderBuffer::new(&mut data);
let (value, buffer) = buffer.decode_with_len_prefix::<u8, u16>().unwrap();
assert_eq!(value, 1);
assert_eq!(buffer, [2, 3][..])
The DecoderValue
implementation of T
must consume the entire subslice
otherwise an error will be returned.
let mut data = [3, 0, 1, 2];
let buffer = DecoderBuffer::new(&mut data);
let result = buffer.decode_with_len_prefix::<u8, u16>();
assert!(result.is_err())
sourcepub fn decode_parameterized<T: DecoderParameterizedValue<'a>>(
self,
parameter: T::Parameter
) -> DecoderBufferResult<'a, T>
pub fn decode_parameterized<T: DecoderParameterizedValue<'a>>(
self,
parameter: T::Parameter
) -> DecoderBufferResult<'a, T>
Decode a parameterized value of type T
implementing DecoderParameterizedValue
sourcepub fn skip(self, count: usize) -> Result<DecoderBuffer<'a>, DecoderError>
pub fn skip(self, count: usize) -> Result<DecoderBuffer<'a>, DecoderError>
Skip a count
of bytes, discarding the bytes
let mut data = [0, 1, 2, 3, 4];
let buffer = DecoderBuffer::new(&mut data);
let buffer = buffer.skip(3).unwrap();
assert_eq!(buffer, [3, 4][..]);
sourcepub fn skip_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self
) -> Result<DecoderBuffer<'a>, DecoderError>
pub fn skip_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self
) -> Result<DecoderBuffer<'a>, DecoderError>
Skip a number of bytes encoded as a length prefix of type Length
With a Length
encoded as u8
:
let mut data = [5, 0, 1, 2, 3, 4];
let buffer = DecoderBuffer::new(&mut data);
let buffer = buffer.skip_with_len_prefix::<u8>().unwrap();
assert!(buffer.is_empty());
sourcepub fn skip_into_range(
self,
count: usize,
original_buffer: &DecoderBufferMut<'_>
) -> DecoderBufferResult<'a, CheckedRange>
pub fn skip_into_range(
self,
count: usize,
original_buffer: &DecoderBufferMut<'_>
) -> DecoderBufferResult<'a, CheckedRange>
Skip a count
of bytes, returning a CheckedRange
for later access
sourcepub fn skip_into_range_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self,
original_buffer: &DecoderBufferMut<'_>
) -> DecoderBufferResult<'a, CheckedRange>
pub fn skip_into_range_with_len_prefix<Length: DecoderValue<'a> + TryInto<usize>>(
self,
original_buffer: &DecoderBufferMut<'_>
) -> DecoderBufferResult<'a, CheckedRange>
Skip a number of bytes encoded as a length prefix of type Length
into a CheckedRange
for later access
sourcepub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_>
pub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_>
Reads data from a CheckedRange
sourcepub fn peek(&'a self) -> DecoderBuffer<'a>
pub fn peek(&'a self) -> DecoderBuffer<'a>
Create a peeking DecoderBuffer
from the current buffer view
let mut data = [0, 1];
let buffer = DecoderBuffer::new(&mut data);
let peek = buffer.peek();
let (value, peek) = peek.decode::<u16>().unwrap();
assert_eq!(value, 1);
assert!(peek.is_empty());
// `buffer` still contains the previous view
assert_eq!(buffer, [0, 1][..]);
sourcepub fn peek_byte(&self, index: usize) -> Result<u8, DecoderError>
pub fn peek_byte(&self, index: usize) -> Result<u8, DecoderError>
Returns a single byte at index
let mut data = [0, 1, 2];
let buffer = DecoderBuffer::new(&mut data);
assert_eq!(buffer.peek_byte(0).unwrap(), 0);
assert_eq!(buffer.peek_byte(1).unwrap(), 1);
assert_eq!(buffer.peek_byte(2).unwrap(), 2);
// `buffer` has not changed
assert_eq!(buffer, [0, 1, 2][..]);
sourcepub fn peek_range(
&self,
range: Range<usize>
) -> Result<DecoderBuffer<'_>, DecoderError>
pub fn peek_range(
&self,
range: Range<usize>
) -> Result<DecoderBuffer<'_>, DecoderError>
Returns a PeekBuffer
by range
sourcepub fn ensure_empty(&self) -> Result<(), DecoderError>
pub fn ensure_empty(&self) -> Result<(), DecoderError>
Returns an error if the buffer is not empty.
let mut data = [1];
let buffer = DecoderBuffer::new(&mut data);
assert!(buffer.ensure_empty().is_err());
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert!(buffer.ensure_empty().is_ok());
sourcepub fn ensure_len(&self, len: usize) -> Result<(), DecoderError>
pub fn ensure_len(&self, len: usize) -> Result<(), DecoderError>
Returns an error if the buffer does not have at least len
bytes.
let mut data = [0, 1, 2];
let buffer = DecoderBuffer::new(&mut data);
assert!(buffer.ensure_len(2).is_ok());
assert!(buffer.ensure_len(5).is_err());
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of bytes in the buffer.
let mut data = [0, 1, 2];
let buffer = DecoderBuffer::new(&mut data);
assert_eq!(buffer.len(), 3);
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert_eq!(buffer.len(), 2);
Trait Implementations
sourceimpl<'a> Clone for DecoderBuffer<'a>
impl<'a> Clone for DecoderBuffer<'a>
sourcefn clone(&self) -> DecoderBuffer<'a>
fn clone(&self) -> DecoderBuffer<'a>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl<'a> Debug for DecoderBuffer<'a>
impl<'a> Debug for DecoderBuffer<'a>
sourceimpl<'a> DecoderValue<'a> for DecoderBuffer<'a>
impl<'a> DecoderValue<'a> for DecoderBuffer<'a>
fn decode(buffer: DecoderBuffer<'a>) -> DecoderBufferResult<'a, Self>
sourceimpl<'a> DecoderValueMut<'a> for DecoderBuffer<'a>
impl<'a> DecoderValueMut<'a> for DecoderBuffer<'a>
fn decode_mut(buffer: DecoderBufferMut<'a>) -> DecoderBufferMutResult<'a, Self>
sourceimpl EncoderValue for DecoderBuffer<'_>
impl EncoderValue for DecoderBuffer<'_>
sourcefn encoding_size(&self) -> usize
fn encoding_size(&self) -> usize
Returns the encoding size with no buffer constrains
sourcefn encoding_size_for_encoder<E: Encoder>(&self, _encoder: &E) -> usize
fn encoding_size_for_encoder<E: Encoder>(&self, _encoder: &E) -> usize
Returns the encoding size for the given encoder’s capacity
sourcefn encode_mut<E: Encoder>(&mut self, encoder: &mut E)
fn encode_mut<E: Encoder>(&mut self, encoder: &mut E)
Encodes the value into the encoder, while potentially mutating the value itself
sourcefn encode_with_len_prefix<Len: TryFrom<usize> + EncoderValue, E: Encoder>(
&self,
encoder: &mut E
) where
Self: Sized,
Len::Error: Debug,
fn encode_with_len_prefix<Len: TryFrom<usize> + EncoderValue, E: Encoder>(
&self,
encoder: &mut E
) where
Self: Sized,
Len::Error: Debug,
Encodes the value into the encoder with a prefix of Len
sourceimpl<'a> From<DecoderBufferMut<'a>> for DecoderBuffer<'a>
impl<'a> From<DecoderBufferMut<'a>> for DecoderBuffer<'a>
sourcefn from(b: DecoderBufferMut<'a>) -> Self
fn from(b: DecoderBufferMut<'a>) -> Self
Performs the conversion.
sourceimpl<'a> Hash for DecoderBuffer<'a>
impl<'a> Hash for DecoderBuffer<'a>
sourceimpl<'a> Ord for DecoderBuffer<'a>
impl<'a> Ord for DecoderBuffer<'a>
sourceimpl<'a> PartialEq<DecoderBuffer<'a>> for DecoderBuffer<'a>
impl<'a> PartialEq<DecoderBuffer<'a>> for DecoderBuffer<'a>
sourcefn eq(&self, other: &DecoderBuffer<'a>) -> bool
fn eq(&self, other: &DecoderBuffer<'a>) -> bool
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
sourcefn ne(&self, other: &DecoderBuffer<'a>) -> bool
fn ne(&self, other: &DecoderBuffer<'a>) -> bool
This method tests for !=
.
sourceimpl<'a> PartialOrd<DecoderBuffer<'a>> for DecoderBuffer<'a>
impl<'a> PartialOrd<DecoderBuffer<'a>> for DecoderBuffer<'a>
sourcefn partial_cmp(&self, other: &DecoderBuffer<'a>) -> Option<Ordering>
fn partial_cmp(&self, other: &DecoderBuffer<'a>) -> Option<Ordering>
This method returns an ordering between self
and other
values if one exists. Read more
1.0.0 · sourcefn lt(&self, other: &Rhs) -> bool
fn lt(&self, other: &Rhs) -> bool
This method tests less than (for self
and other
) and is used by the <
operator. Read more
1.0.0 · sourcefn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
impl<'a> Copy for DecoderBuffer<'a>
impl<'a> Eq for DecoderBuffer<'a>
impl<'a> StructuralEq for DecoderBuffer<'a>
impl<'a> StructuralPartialEq for DecoderBuffer<'a>
Auto Trait Implementations
impl<'a> RefUnwindSafe for DecoderBuffer<'a>
impl<'a> Send for DecoderBuffer<'a>
impl<'a> Sync for DecoderBuffer<'a>
impl<'a> Unpin for DecoderBuffer<'a>
impl<'a> UnwindSafe for DecoderBuffer<'a>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcepub fn to_owned(&self) -> T
pub fn to_owned(&self) -> T
Creates owned data from borrowed data, usually by cloning. Read more
sourcepub fn clone_into(&self, target: &mut T)
pub fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more