Как связать функции чтения Токио? - PullRequest
0 голосов
/ 19 октября 2018

Есть ли способ связать функции read_* в tokio::io "рекурсивным" способом?

Я, по сути, хочу сделать что-то вроде:

read_untilx затем read_exact y затем напишите ответ, затем вернитесь к началу.

Если вы не уверены, о каких функциях я говорю: https://docs.rs/tokio/0.1.11/tokio/io/index.html

1 Ответ

0 голосов
/ 19 октября 2018

Да, есть способ.

read_until возвращает структуру ReadUntil, которая реализует Future -trait, который сам по себе предоставляет множество полезных функций, например and_then, которые можно использовать для цепочки фьючерсов.

Простой (и глупый) пример выглядит следующим образом:

extern crate futures;
extern crate tokio_io; // 0.1.8 // 0.1.24

use futures::future::Future;
use std::io::Cursor;
use tokio_io::io::{read_exact, read_until};

fn main() {
    let cursor = Cursor::new(b"abcdef\ngh");
    let mut buf = vec![0u8; 2];
    println!(
        "{:?}",
        String::from_utf8_lossy(
            read_until(cursor, b'\n', vec![])
                .and_then(|r| read_exact(r.0, &mut buf))
                .wait()
                .unwrap()
                .1
        )
    );
}

Здесь я использую Курсор, который реализует черту AsyncRead и использую функцию read_until для чтения до появления новой строки (между 'f' и * 1025).*).
Впоследствии, чтобы связать тех, кого я использую and_then, чтобы использовать read_exact в случае успеха, используйте wait, чтобы получить Result, разверните его (не делайте этогов производстве дети!) и возьмите второй аргумент из кортежа (первый - курсор).
В последний раз я преобразую Vec в строку для отображения "gh" с println!.

...