#buffer #io #zero-copy

buf-list

实现了bytes::Buf特质的缓冲区列表

8个版本 (4个稳定版)

1.0.3 2023年4月9日
1.0.1 2023年2月17日
1.0.0 2023年1月6日
0.1.3 2022年12月11日

#167网络编程

Download history 2143/week @ 2024-03-14 2262/week @ 2024-03-21 2348/week @ 2024-03-28 3173/week @ 2024-04-04 2028/week @ 2024-04-11 2037/week @ 2024-04-18 2548/week @ 2024-04-25 1869/week @ 2024-05-02 3334/week @ 2024-05-09 2087/week @ 2024-05-16 1835/week @ 2024-05-23 1970/week @ 2024-05-30 1396/week @ 2024-06-06 1385/week @ 2024-06-13 2483/week @ 2024-06-20 1386/week @ 2024-06-27

每月7,057次下载
2 个 crate中使用

Apache-2.0

61KB
1K SLoC

buf-list

buf-list on crates.io Documentation (latest release) Documentation (main) License

字节块片段的分段列表。

概述

此crate提供了一个BufList类型,该类型是Bytes块列表。该类型实现了bytes::Buf,因此可以用于任何使用Buf的API。

BufList的主要用例是缓冲作为流接收的数据块,而不必将它们复制到单个连续的内存块中。然后可以将BufList传递到任何接受Buf的API。

如果你曾经想要一个Vec<Bytes>或一个VecDeque<Bytes>,那么这个类型就是为你准备的。

光标

此crate还提供了Cursor,它是一个围绕BufList的光标类型。围绕BufList的光标实现了SeekReadBufRead,类似于std::io::Cursor

示例

将块收集到BufList中,然后一次性将它们全部写入标准错误

use buf_list::BufList;
use tokio::io::AsyncWriteExt;

let mut buf_list = BufList::new();
buf_list.push_chunk(&b"hello "[..]);
buf_list.push_chunk(&b"world"[..]);
buf_list.push_chunk(&b"!"[..]);

let mut stderr = tokio::io::stderr();
stderr.write_all_buf(&mut buf_list).await?;

将可出错的Bytes流收集到BufList

use buf_list::BufList;
use bytes::Bytes;
use futures::TryStreamExt;

// A common example is a stream of bytes read over HTTP.
let stream = futures::stream::iter(
    vec![
        Ok(Bytes::from_static(&b"laputa, "[..])),
        Ok(Bytes::from_static(&b"castle "[..])),
        Ok(Bytes::from_static(&b"in the sky"[..]))
    ],
);

let buf_list = stream.try_collect::<BufList>().await?;
assert_eq!(buf_list.num_chunks(), 3);

转换为Stream

可以将BufList转换为futures::StreamTryStreamBytes块流。使用此方法进行转换

(一旦 Stream 和/或 TryStream 成为稳定 Rust 的一部分,此内容将被暴露为 BufList 上的 API。)

use buf_list::BufList;
use bytes::Bytes;
use futures::{Stream, TryStream};

fn into_stream(buf_list: BufList) -> impl Stream<Item = Bytes> {
    futures::stream::iter(buf_list)
}

fn into_try_stream<E>(buf_list: BufList) -> impl TryStream<Ok = Bytes, Error = E> {
    futures::stream::iter(buf_list.into_iter().map(Ok))
}

可选功能

  • tokio1:启用此功能后,Cursor 实现了 tokio 包的 AsyncSeekAsyncReadAsyncBufRead

  • futures03:启用此功能后,Cursor 实现了 futures 包的 AsyncSeekAsyncReadAsyncBufRead

    注意,支持 futures03 意味着以公共接口导出 0.x 类型。这违反了 C-STABLE 指南。然而,buf-list 的维护者认为这是可以接受的,因为 futures03 是一个可选功能,且不是 buf-list 的关键。随着 futures 包的新版本发布,buf-list 也将支持它们异步特质的版本。

最低支持的 Rust 版本

最低支持的 Rust 版本 (MSRV) 为 1.39,与 bytes 包相同。可选功能可能导致 MSRV 的提升。

预计 MSRV 在未来不会改变。如果 MSRV 发生变化,它将伴随 buf-list 的主要版本号的提升。

贡献

欢迎提交拉取请求!请遵循 行为准则

许可证

buf-list 版权所有 2022 buf-list 贡献者。保留所有权利。

从 linkerd2-proxy 复制并改编;由 Eliza Weisman 编写的原始代码,版权所有 2018 linkerd2-proxy 作者。保留所有权利。

根据 Apache License,版本 2.0(“许可证”);除非适用法律要求或经书面同意,否则不得使用这些文件,除非遵守许可证。您可以在以下位置获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或经书面同意,否则在许可证下分发的软件按“原样”提供,不提供任何明示或暗示的保证或条件。有关许可证中规定的权限和限制的具体语言,请参阅许可证。

依赖关系

~0.1–1.3MB
~22K SLoC