#tokio #offers #seek #io #wrapper #limit #read

tokio-take-seek

提供对 tokio::io::Take 的包装,该包装提供了 tokio::io::AsyncSeek 实现

1 个不稳定版本

0.1.0 2022年6月8日

#15 in #seek

MIT/Apache

12KB
224

tokio-take-seek

这为 tokio::io::Take 提供了一个包装,它提供了 tokio::io::AsyncSeek 实现(只要内部使用的处理程序也实现了它)。想法是使用 Take 实现作为 上限,不允许读取超过该点,当调用 seek 操作时,底层读取字节数的极限将得到适当的更新。

提供的 AsyncTakeSeekExt trait 为实现 AsyncRead + AsyncSeek + Unpin 的任何类型提供了 take_with_seek 方法,用于创建包装。

实现

当前实现必须在每次调用 seek 时内部执行两个查找。第一个 seek 使用 SeekFrom::current(0) 执行,并且它的结果用于确定流移动了多少,以便正确更新 Take 的内部限制。

使用示例

在这个示例中,我们使用 take_with_seek 来保证字符串不会读取超过期望的限制,同时仍然能够在创建界限之后在读取器上执行查找操作。

async fn basic_seek_and_reed() {
    let file = tempfile::NamedTempFile::new().unwrap();
    //                                        21v               38v
    fs::write(file.path(), "this will be skipped|this will be read|this will be guarded")
        .await
        .unwrap();

    let mut handle = TakeSeek::new(take::take(fs::File::open(file.path()).await.unwrap(), 38));
    handle.seek(SeekFrom::Start(21)).await.unwrap();

    let mut data = String::default();
    handle.read_to_string(&mut data).await.unwrap();
    assert_eq!(data, "this will be read");
}

依赖关系

~2.1–3MB
~49K SLoC