Rust futures —— 将一个函数改编成一个 Sink

Rust futures -- adapting a function as a Sink

我有一个类似于 tokio connect example 的东西,它有一个接受接收器的方法:

pub async fn connect(
        addr: &SocketAddr,
        mut stdin: impl Stream<Item = Result<Request, io::Error>> + Unpin,
        mut stdout: impl Sink<Response, Error = io::Error> + Unpin,
    ) -> Result<(), Box<dyn Error>> {

有没有一种 standard/easy 方法可以使函数适应接收器以进行打印 and/or 转换?

例如。类似于:

connect(.., .., sink::from_function(|r| match r {
    Ok(response) => println!("received a response: {:?}", response),
    Err(e) => println!("error! {:?}", e);
})
.await;

您可以使用 drain() function (which creates a sink that just discards all items) chained with the .with() 方法(映射接收器的输入)从函数创建接收器:

use futures::prelude::*;
use futures::sink::drain;

let sink = drain().with(|value| async move { // <-- note async block
    // do something with the input...

    // then return a result
    Ok(())
});

您还可以使用 .with() 检查或转换现有流,您只需要确保您 return 来自闭包的成功类型与您输入的流相同正在转型。

Playground example