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 来自闭包的成功类型与您输入的流相同正在转型。
我有一个类似于 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 来自闭包的成功类型与您输入的流相同正在转型。