#tokio #read-stream #stream #io #async-io #rewind #read-write

tokio-io-rewind

一个简单的库,用于回滚 tokio::io::AsyncRead 和 tokio::io::AsyncWrite 流

4 个版本

0.1.3 2024 年 5 月 23 日
0.1.2 2024 年 3 月 26 日
0.1.1 2024 年 3 月 26 日
0.1.0 2024 年 3 月 26 日

#300 in 异步

Download history 174/week @ 2024-04-08 67/week @ 2024-04-15 45/week @ 2024-04-22 9/week @ 2024-04-29 65/week @ 2024-05-06 72/week @ 2024-05-13 180/week @ 2024-05-20 45/week @ 2024-05-27 45/week @ 2024-06-03 99/week @ 2024-07-01

每月 99 次下载

MIT 许可证

10KB
105 代码行

tokio-io-rewind

crates.io Released API docs MIT licensed

tokio-io-rewind 是一个 Rust 包,为实现了 AsyncReadAsyncWrite 特性的类型提供包装,允许在读取流的开头添加字节。此功能特别适用于需要重新检查或再次处理从流中读取的数据的场景,因此是网络、解析和代理任务中数据操作的理想选择。

功能

  • 添加字节:轻松将字节添加到读取流的开头。
  • 透明异步操作:与异步读取和写入操作无缝协作,确保最小开销。
  • 灵活性:可用于实现 AsyncReadAsyncWrite 的任何类型,提供广泛的应用性。

用法

要使用 tokio-io-rewind,将其添加为 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");
}

高级用法

对于更高级的使用案例,如预缓冲数据或处理复杂的异步写入操作,可以通过额外的缓冲状态或集成到自定义异步流程中来配置 tokio-io-rewind

缓冲初始化

要使用缓冲区初始化,可以使用

let preloaded_buffer = Bytes::from_static(b"initial data");
let rewind_stream = Rewind::new_buffered(inner_stream, preloaded_buffer);

这将预先加载流以“初始数据”,这些数据将在后续数据之前被读取。

许可证

MIT 许可证

依赖关系

~2.1–3MB
~49K SLoC