pub struct DecoderBufferMut<'a> { /* private fields */ }
Expand description
DecoderBufferMut is a panic-free, mutable byte buffer for decoding untrusted input
Implementations§
Source§impl<'a> DecoderBufferMut<'a>
impl<'a> DecoderBufferMut<'a>
Sourcepub fn freeze(self) -> DecoderBuffer<'a>
pub fn freeze(self) -> DecoderBuffer<'a>
Freeze the mutable buffer into a DecoderBuffer
Sourcepub fn into_less_safe_slice(self) -> &'a mut [u8] ⓘ
pub fn into_less_safe_slice(self) -> &'a mut [u8] ⓘ
Move out the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
Sourcepub fn as_less_safe_slice_mut(&'a mut self) -> &'a mut [u8] ⓘ
pub fn as_less_safe_slice_mut(&'a mut self) -> &'a mut [u8] ⓘ
Mutably borrow the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
Source§impl<'a> DecoderBufferMut<'a>
impl<'a> DecoderBufferMut<'a>
Sourcepub fn decode_slice(
self,
count: usize,
) -> DecoderBufferMutResult<'a, DecoderBufferMut<'a>>
pub fn decode_slice( self, count: usize, ) -> DecoderBufferMutResult<'a, DecoderBufferMut<'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 = DecoderBufferMut::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: DecoderValueMut<'a>>(self) -> DecoderBufferMutResult<'a, T>
pub fn decode<T: DecoderValueMut<'a>>(self) -> DecoderBufferMutResult<'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 = DecoderBufferMut::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: DecoderValueMut<'a> + TryInto<usize>>(
self,
) -> DecoderBufferMutResult<'a, Self>
pub fn decode_slice_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>>( self, ) -> DecoderBufferMutResult<'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 = DecoderBufferMut::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 = DecoderBufferMut::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: DecoderValueMut<'a> + TryInto<usize>, T: DecoderValueMut<'a>>(
self,
) -> DecoderBufferMutResult<'a, T>
pub fn decode_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>, T: DecoderValueMut<'a>>( self, ) -> DecoderBufferMutResult<'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 = DecoderBufferMut::new(&mut data);
let (value, buffer) = buffer.decode_with_len_prefix::<u8, u16>().unwrap();
assert_eq!(value, 1);
assert_eq!(buffer, [2, 3][..])
The DecoderValueMut
implementation of T
must consume the entire subslice
otherwise an error will be returned.
let mut data = [3, 0, 1, 2];
let buffer = DecoderBufferMut::new(&mut data);
let result = buffer.decode_with_len_prefix::<u8, u16>();
assert!(result.is_err())
Sourcepub fn decode_parameterized<T: DecoderParameterizedValueMut<'a>>(
self,
parameter: T::Parameter,
) -> DecoderBufferMutResult<'a, T>
pub fn decode_parameterized<T: DecoderParameterizedValueMut<'a>>( self, parameter: T::Parameter, ) -> DecoderBufferMutResult<'a, T>
Decode a parameterized value of type T
implementing DecoderParameterizedValueMut
Sourcepub fn skip(self, count: usize) -> Result<DecoderBufferMut<'a>, DecoderError>
pub fn skip(self, count: usize) -> Result<DecoderBufferMut<'a>, DecoderError>
Skip a count
of bytes, discarding the bytes
let mut data = [0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let buffer = buffer.skip(3).unwrap();
assert_eq!(buffer, [3, 4][..]);
Sourcepub fn skip_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>>(
self,
) -> Result<DecoderBufferMut<'a>, DecoderError>
pub fn skip_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>>( self, ) -> Result<DecoderBufferMut<'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 = DecoderBufferMut::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<'_>,
) -> DecoderBufferMutResult<'a, CheckedRange>
pub fn skip_into_range( self, count: usize, original_buffer: &DecoderBufferMut<'_>, ) -> DecoderBufferMutResult<'a, CheckedRange>
Skip a count
of bytes, returning a CheckedRange
for later access
Sourcepub fn skip_into_range_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>>(
self,
original_buffer: &DecoderBufferMut<'_>,
) -> DecoderBufferMutResult<'a, CheckedRange>
pub fn skip_into_range_with_len_prefix<Length: DecoderValueMut<'a> + TryInto<usize>>( self, original_buffer: &DecoderBufferMut<'_>, ) -> DecoderBufferMutResult<'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 = DecoderBufferMut::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 = DecoderBufferMut::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 = DecoderBufferMut::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 = DecoderBufferMut::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 = DecoderBufferMut::new(&mut data);
assert_eq!(buffer.len(), 3);
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert_eq!(buffer.len(), 2);
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if the buffer has a length of 0.
let mut data = [1];
let buffer = DecoderBufferMut::new(&mut data);
assert!(!buffer.is_empty());
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert!(buffer.is_empty());
Sourcepub fn as_less_safe_slice(&'a self) -> &'a [u8] ⓘ
pub fn as_less_safe_slice(&'a self) -> &'a [u8] ⓘ
Borrows the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
Trait Implementations§
Source§impl<'a> Debug for DecoderBufferMut<'a>
impl<'a> Debug for DecoderBufferMut<'a>
Source§impl<'a> DecoderValueMut<'a> for DecoderBufferMut<'a>
impl<'a> DecoderValueMut<'a> for DecoderBufferMut<'a>
fn decode_mut(buffer: DecoderBufferMut<'a>) -> DecoderBufferMutResult<'a, Self>
Source§impl EncoderValue for DecoderBufferMut<'_>
impl EncoderValue for DecoderBufferMut<'_>
Source§fn encoding_size(&self) -> usize
fn encoding_size(&self) -> usize
Source§fn encoding_size_for_encoder<E: Encoder>(&self, _encoder: &E) -> usize
fn encoding_size_for_encoder<E: Encoder>(&self, _encoder: &E) -> usize
Source§fn encode_mut<E: Encoder>(&mut self, encoder: &mut E)
fn encode_mut<E: Encoder>(&mut self, encoder: &mut E)
Source§fn encode_with_len_prefix<Len: TryFrom<usize> + EncoderValue, E: Encoder>(
&self,
encoder: &mut E,
)
fn encode_with_len_prefix<Len: TryFrom<usize> + EncoderValue, E: Encoder>( &self, encoder: &mut E, )
Len