【问题标题】:How to wrap a `futures::Stream` into anything that implements `Write`?如何将`futures::Stream`包装到任何实现`Write`的东西中?
【发布时间】:2020-12-29 21:38:31
【问题描述】:

最终我需要一个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,它接受两个参数,一个用于impl Read,另一个用于impl Write,其中读取和写入来自std::io

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

【问题讨论】:

  • process函数是同步运行还是异步运行?
  • 您知道ByteStreaminto_blocking_read() 方法,对吧?你试过吗?为什么它不起作用?
  • @pretzelhammer,现在同步。 @Coder-256,但是 process() 方法需要写入它,而不是从 ByteStream 中读取,并且没有 into_write 方法。

标签: rust stream rusoto


【解决方案1】:

您无法像无法写入Iterator 一样写入Stream,它们是只读接口。您必须写入其他内容,然后让其他内容实现 Stream 特征,以便可以从中读取。在您的情况下,由于process 是同步的,您可以将Vec&lt;u8&gt; 缓冲区传递给它,然后使用From&lt;Vec&lt;u8&gt;&gt; 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
}

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2019-09-09
    相关资源
    最近更新 更多