Skip to main content

Limit

Struct Limit 

Source
pub struct Limit<R> { /* private fields */ }
Expand description

Limit the number of bytes that can be read out of a reader to the specified limit.

This type wraps another reader and ensures that no more than a specified number of bytes can be read from it. This is useful for implementing bounded reads in serialization contexts.

Constructed through Reader::limit.

§Examples

use musli::Context;
use musli::reader::{Reader, SliceReader};

let cx = musli::context::new();
let data = &[1, 2, 3, 4, 5];
let mut reader = SliceReader::new(data);
let mut limited = reader.limit(3);

// Can read from the limited reader
let byte = limited.read_byte(&cx)?;
assert_eq!(byte, 1);
assert_eq!(limited.remaining(), 2);

// Read two more bytes
limited.read_byte(&cx)?;
limited.read_byte(&cx)?;
assert_eq!(limited.remaining(), 0);

Implementations§

Source§

impl<R> Limit<R>

Source

pub fn remaining(&self) -> usize

Get the remaining data in the limited reader.

Returns the number of bytes that can still be read from this limited reader before the limit is reached.

§Examples
use musli::reader::{Reader, SliceReader};

let data = &[1, 2, 3, 4, 5];
let mut reader = SliceReader::new(data);
let limited = reader.limit(3);

assert_eq!(limited.remaining(), 3);

Trait Implementations§

Source§

impl<'de, R> Reader<'de> for Limit<R>
where R: Reader<'de>,

Source§

type Mut<'this> = &'this mut Limit<R> where Self: 'this

Type borrowed from self. Read more
Source§

type TryClone = Limit<<R as Reader<'de>>::TryClone>

Type that can be cloned from the reader.
Source§

fn borrow_mut(&mut self) -> Self::Mut<'_>

Borrow the current reader.
Source§

fn try_clone(&self) -> Option<Self::TryClone>

Try to clone the reader.
Source§

fn is_eof(&mut self) -> bool

Test if the reader is at end of input.
Source§

fn skip<C>(&mut self, cx: C, n: usize) -> Result<(), C::Error>
where C: Context,

Skip over the given number of bytes.
Source§

fn read_bytes<C, V>( &mut self, cx: C, n: usize, visitor: V, ) -> Result<V::Ok, V::Error>
where C: Context, V: UnsizedVisitor<'de, C, [u8], Error = C::Error, Allocator = C::Allocator>,

Read a slice out of the current reader.
Source§

unsafe fn read_bytes_uninit<C>( &mut self, cx: C, ptr: *mut u8, n: usize, ) -> Result<(), C::Error>
where C: Context,

Read into the given buffer which might not have been initialized. Read more
Source§

fn peek(&mut self) -> Option<u8>

Peek the next value.
Source§

fn read<C>(&mut self, cx: C, buf: &mut [u8]) -> Result<(), C::Error>
where C: Context,

Read a slice into the given buffer.
Source§

fn read_byte<C>(&mut self, cx: C) -> Result<u8, C::Error>
where C: Context,

Read a single byte.
Source§

fn read_array<C, const N: usize>(&mut self, cx: C) -> Result<[u8; N], C::Error>
where C: Context,

Read an array out of the current reader.
Source§

fn limit(self, limit: usize) -> Limit<Self>
where Self: Sized,

Keep an accurate record of the position within the reader.

Auto Trait Implementations§

§

impl<R> Freeze for Limit<R>
where R: Freeze,

§

impl<R> RefUnwindSafe for Limit<R>
where R: RefUnwindSafe,

§

impl<R> Send for Limit<R>
where R: Send,

§

impl<R> Sync for Limit<R>
where R: Sync,

§

impl<R> Unpin for Limit<R>
where R: Unpin,

§

impl<R> UnsafeUnpin for Limit<R>
where R: UnsafeUnpin,

§

impl<R> UnwindSafe for Limit<R>
where R: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.