微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 `futures::Stream` 包装到任何实现 `Write` 的东西中?

如何解决如何将 `futures::Stream` 包装到任何实现 `Write` 的东西中?

最终我需要一个 ByteStream 来表示 rusoto。所以我想我可以从 futures::Stream:

pub fn z_stream(r: impl Read) -> Result<ByteStream> {
  let outstream = stream::empty();

  // Todo,how do I wrap outstream
  process(r,&mut wrapped_outstream)?;

  Ok(ByteStream::new(outstream))
}

我有一个方法 process,它接受​​ 2 个参数,一个用于 impl Read,另一个用于 impl Write,其中读取和写入来自 std::io

如何将上面的 outstream 包装成允许我将其传递给 process 的东西?可能已经有一些东西了,我不必编写自己的包装器?

解决方法

您不能像写入 Stream 一样写入 Iterator,它们是只读接口。您必须写入其他内容,然后让其他内容实现 Stream 特征,以便可以从中读取。在您的情况下,由于 process 是同步的,您可以将 Vec<u8> 缓冲区传递给它,然后使用 From<Vec<u8>> impl 将该缓冲区转换为 ByteStream:>

use std::io::Write;

pub fn z_stream(r: impl Read) -> Result<ByteStream> {
  let buffer: Vec<u8> = Vec::new();

  process(r,&mut buffer)?; // &mut Vec<u8> impls io::Write

  Ok(buffer.into()) // ByteStream has From<Vec<u8>> impl
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。