pub struct UndoReader<T>{ /* private fields */ }
Expand description
Undo reader supports unread(&u8) Useful when you are doing serialization/deserialization where you need to put data back (undo the read) You can use UndoReader as if it is a normal AsyncRead Additionally, UndoReader supports a limit as well. It would stop reading after limit is reached (EOF) Example:
// You can have rust code between fences inside the comments
// If you pass --test to `rustdoc`, it will even test it for you!
async fn do_test() -> Result<(), Box<dyn std::error::Error>> {
use tokio::io::{AsyncRead,AsyncSeek,AsyncReadExt, AsyncSeekExt};
let f = tokio::fs::File::open("input.txt").await?;
let mut my_undo = crate::asyncio_utils::UndoReader::new(f, Some(10)); // only read 10 bytes
let mut buff = vec![0u8; 10];
let read_count = my_undo.read(&mut buff).await?;
if read_count > 0 {
// inspect the data read check if it is ok
my_undo.unread(&mut buff[0..read_count]); // put all bytes back
}
let data = "XYZ".as_bytes();
my_undo.unread(&data);
// this should be 3 (the "XYZ" should be read here)
let second_read_count = my_undo.read(&mut buff).await?;
// this should be equal to read_count because it would have been reread here
let third_read_count = my_undo.read(&mut buff).await?;
// ...
Ok(())
}
Implementations§
Source§impl<T> UndoReader<T>
impl<T> UndoReader<T>
Sourcepub fn destruct(self) -> (Vec<u8>, T)
pub fn destruct(self) -> (Vec<u8>, T)
Destruct this UndoReader.
Returns the buffer that has been unread but has not been consumed as well as the raw AsyncRead Example:
// initialize my_undo
async fn do_test() -> Result<(), Box<dyn std::error::Error>> {
let f = tokio::fs::File::open("input.txt").await?;
let my_undo = crate::asyncio_utils::UndoReader::new(f, None);
let (remaining, raw) = my_undo.destruct();
// ...
Ok(())
}
// remaining is the bytes to be consumed.
// raw is the raw AsyncRead
The UndoReader can’t be used anymore after this call
Sourcepub fn limit(&self) -> usize
pub fn limit(&self) -> usize
Get the limit of the UndoReader If the limit was None, this would be the usize’s max value.
Sourcepub fn count_unread(&self) -> usize
pub fn count_unread(&self) -> usize
Count the number of bytes in the unread buffer
Sourcepub fn new(src: T, limit: Option<usize>) -> UndoReader<T>
pub fn new(src: T, limit: Option<usize>) -> UndoReader<T>
Create new UndoReader with limitation.
If limit is None, std::usize::MAX
will be used
If limit is Some(limit:usize), the limit will be used
Sourcepub fn unread(&mut self, data: &[u8]) -> &mut Self
pub fn unread(&mut self, data: &[u8]) -> &mut Self
Put data for unread so it can be read again.
Reading of unread data does not count towards the limit because we assume you unconsumed something you consumed in the first place.
However, practically, you can arbitrarily unread any data. So the limit may break the promise in such cases
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for UndoReader<T>where
T: Freeze,
impl<T> RefUnwindSafe for UndoReader<T>where
T: RefUnwindSafe,
impl<T> Send for UndoReader<T>where
T: Send,
impl<T> Sync for UndoReader<T>where
T: Sync,
impl<T> Unpin for UndoReader<T>
impl<T> UnwindSafe for UndoReader<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<R> AsyncReadExt for R
impl<R> AsyncReadExt for R
Source§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
Source§fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
Source§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
buf
. Read moreSource§fn read_u8(&mut self) -> ReadU8<&mut Self>where
Self: Unpin,
fn read_u8(&mut self) -> ReadU8<&mut Self>where
Self: Unpin,
Source§fn read_i8(&mut self) -> ReadI8<&mut Self>where
Self: Unpin,
fn read_i8(&mut self) -> ReadI8<&mut Self>where
Self: Unpin,
Source§fn read_u16(&mut self) -> ReadU16<&mut Self>where
Self: Unpin,
fn read_u16(&mut self) -> ReadU16<&mut Self>where
Self: Unpin,
Source§fn read_i16(&mut self) -> ReadI16<&mut Self>where
Self: Unpin,
fn read_i16(&mut self) -> ReadI16<&mut Self>where
Self: Unpin,
Source§fn read_u32(&mut self) -> ReadU32<&mut Self>where
Self: Unpin,
fn read_u32(&mut self) -> ReadU32<&mut Self>where
Self: Unpin,
Source§fn read_i32(&mut self) -> ReadI32<&mut Self>where
Self: Unpin,
fn read_i32(&mut self) -> ReadI32<&mut Self>where
Self: Unpin,
Source§fn read_u64(&mut self) -> ReadU64<&mut Self>where
Self: Unpin,
fn read_u64(&mut self) -> ReadU64<&mut Self>where
Self: Unpin,
Source§fn read_i64(&mut self) -> ReadI64<&mut Self>where
Self: Unpin,
fn read_i64(&mut self) -> ReadI64<&mut Self>where
Self: Unpin,
Source§fn read_u128(&mut self) -> ReadU128<&mut Self>where
Self: Unpin,
fn read_u128(&mut self) -> ReadU128<&mut Self>where
Self: Unpin,
Source§fn read_i128(&mut self) -> ReadI128<&mut Self>where
Self: Unpin,
fn read_i128(&mut self) -> ReadI128<&mut Self>where
Self: Unpin,
Source§fn read_f32(&mut self) -> ReadF32<&mut Self>where
Self: Unpin,
fn read_f32(&mut self) -> ReadF32<&mut Self>where
Self: Unpin,
Source§fn read_f64(&mut self) -> ReadF64<&mut Self>where
Self: Unpin,
fn read_f64(&mut self) -> ReadF64<&mut Self>where
Self: Unpin,
Source§fn read_u16_le(&mut self) -> ReadU16Le<&mut Self>where
Self: Unpin,
fn read_u16_le(&mut self) -> ReadU16Le<&mut Self>where
Self: Unpin,
Source§fn read_i16_le(&mut self) -> ReadI16Le<&mut Self>where
Self: Unpin,
fn read_i16_le(&mut self) -> ReadI16Le<&mut Self>where
Self: Unpin,
Source§fn read_u32_le(&mut self) -> ReadU32Le<&mut Self>where
Self: Unpin,
fn read_u32_le(&mut self) -> ReadU32Le<&mut Self>where
Self: Unpin,
Source§fn read_i32_le(&mut self) -> ReadI32Le<&mut Self>where
Self: Unpin,
fn read_i32_le(&mut self) -> ReadI32Le<&mut Self>where
Self: Unpin,
Source§fn read_u64_le(&mut self) -> ReadU64Le<&mut Self>where
Self: Unpin,
fn read_u64_le(&mut self) -> ReadU64Le<&mut Self>where
Self: Unpin,
Source§fn read_i64_le(&mut self) -> ReadI64Le<&mut Self>where
Self: Unpin,
fn read_i64_le(&mut self) -> ReadI64Le<&mut Self>where
Self: Unpin,
Source§fn read_u128_le(&mut self) -> ReadU128Le<&mut Self>where
Self: Unpin,
fn read_u128_le(&mut self) -> ReadU128Le<&mut Self>where
Self: Unpin,
Source§fn read_i128_le(&mut self) -> ReadI128Le<&mut Self>where
Self: Unpin,
fn read_i128_le(&mut self) -> ReadI128Le<&mut Self>where
Self: Unpin,
Source§fn read_f32_le(&mut self) -> ReadF32Le<&mut Self>where
Self: Unpin,
fn read_f32_le(&mut self) -> ReadF32Le<&mut Self>where
Self: Unpin,
Source§fn read_f64_le(&mut self) -> ReadF64Le<&mut Self>where
Self: Unpin,
fn read_f64_le(&mut self) -> ReadF64Le<&mut Self>where
Self: Unpin,
Source§fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>where
Self: Unpin,
fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>where
Self: Unpin,
buf
. Read more