Crates.io | tokio-io-rewind |
lib.rs | tokio-io-rewind |
version | 0.1.3 |
source | src |
created_at | 2024-03-26 19:04:06.258842 |
updated_at | 2024-05-23 09:15:18.393815 |
description | A simple library to rewind tokio::io::AsyncRead and tokio::io::AsyncWrite streams |
homepage | |
repository | https://github.com/automesh-network/tokio-io-rewind |
max_upload_size | |
id | 1186829 |
size | 11,264 |
tokio-io-rewind
is a Rust crate providing a wrapper for types implementing the AsyncRead
and AsyncWrite
traits, allowing for the prepending of bytes to the read stream. This functionality is particularly useful in scenarios where data read from a stream needs to be re-examined or processed again, making it an ideal choice for networking, parsing, and proxying tasks where data manipulation is crucial.
AsyncRead
and AsyncWrite
, offering wide applicability.To use tokio-io-rewind
, add it as a dependency in your Cargo.toml
:
[dependencies]
tokio-io-rewind = "0.1"
use tokio_io_rewind::Rewind;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use bytes::Bytes;
#[tokio::main]
async fn main() {
let inner_stream = tokio::io::Cursor::new(b"world".to_vec());
let mut rewind_stream = Rewind::new(inner_stream);
// Prepend "hello " to the stream
rewind_stream.rewind(Bytes::from_static(b"hello "));
let mut buf = Vec::new();
rewind_stream.read_to_end(&mut buf).await.unwrap();
assert_eq!(buf, b"hello world");
}
For more advanced use cases, such as pre-buffering data or handling complex async write operations, tokio-io-rewind
can be configured with additional buffer states or integrated into custom async flows.
To initialize with a buffer, you can use:
let preloaded_buffer = Bytes::from_static(b"initial data");
let rewind_stream = Rewind::new_buffered(inner_stream, preloaded_buffer);
This preloads the stream with "initial data" that will be read before any subsequent data.