Struct s2n_codec::decoder::buffer::DecoderBuffer
source · pub struct DecoderBuffer<'a> { /* private fields */ }
Expand description
DecoderBuffer is a panic-free byte buffer for look-ahead decoding untrusted input
Implementations§
source§impl<'a> DecoderBuffer<'a>
impl<'a> DecoderBuffer<'a>
source§impl<'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);
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 = DecoderBuffer::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> Clone for DecoderBuffer<'a>
impl<'a> Clone for DecoderBuffer<'a>
source§fn clone(&self) -> DecoderBuffer<'a>
fn clone(&self) -> DecoderBuffer<'a>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'a> Debug for DecoderBuffer<'a>
impl<'a> Debug for DecoderBuffer<'a>
source§impl<'a> DecoderValue<'a> for DecoderBuffer<'a>
impl<'a> DecoderValue<'a> for DecoderBuffer<'a>
fn decode(buffer: DecoderBuffer<'a>) -> DecoderBufferResult<'a, Self>
source§impl<'a> DecoderValueMut<'a> for DecoderBuffer<'a>
impl<'a> DecoderValueMut<'a> for DecoderBuffer<'a>
fn decode_mut(buffer: DecoderBufferMut<'a>) -> DecoderBufferMutResult<'a, Self>
source§impl EncoderValue for DecoderBuffer<'_>
impl EncoderValue for DecoderBuffer<'_>
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
fn encode_to_vec(&self) -> Vec<u8>
source§impl<'a> From<&'a [u8]> for DecoderBuffer<'a>
impl<'a> From<&'a [u8]> for DecoderBuffer<'a>
source§impl<'a> From<&'a mut [u8]> for DecoderBuffer<'a>
impl<'a> From<&'a mut [u8]> for DecoderBuffer<'a>
source§impl<'a> From<DecoderBufferMut<'a>> for DecoderBuffer<'a>
impl<'a> From<DecoderBufferMut<'a>> for DecoderBuffer<'a>
source§fn from(b: DecoderBufferMut<'a>) -> Self
fn from(b: DecoderBufferMut<'a>) -> Self
source§impl<'a> Hash for DecoderBuffer<'a>
impl<'a> Hash for DecoderBuffer<'a>
source§impl<'a> Ord for DecoderBuffer<'a>
impl<'a> Ord for DecoderBuffer<'a>
source§fn cmp(&self, other: &DecoderBuffer<'a>) -> Ordering
fn cmp(&self, other: &DecoderBuffer<'a>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl<'a> PartialEq<[u8]> for DecoderBuffer<'a>
impl<'a> PartialEq<[u8]> for DecoderBuffer<'a>
source§impl<'a> PartialEq for DecoderBuffer<'a>
impl<'a> PartialEq for DecoderBuffer<'a>
source§fn eq(&self, other: &DecoderBuffer<'a>) -> bool
fn eq(&self, other: &DecoderBuffer<'a>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'a> PartialOrd for DecoderBuffer<'a>
impl<'a> PartialOrd for DecoderBuffer<'a>
source§fn partial_cmp(&self, other: &DecoderBuffer<'a>) -> Option<Ordering>
fn partial_cmp(&self, other: &DecoderBuffer<'a>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more