Ржавчина фьючерсы - адаптация функции в качестве раковины - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть нечто похожее на пример tokio connect с методом, который принимает приемник:

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>> {

Существует ли стандартный / простой способ адаптации функции к приемнику для печать и / или преобразование?

напр. что-то вроде:

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

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете использовать функцию drain() (которая создает приемник, который просто отбрасывает все элементы), связанный с методом .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() для проверки или преобразования существующего потока, вам просто нужно убедиться, что тип успеха, который вы возвращаете из закрытия, такой же, как вход трансформируемого потока.

Пример игровой площадки

...