Как связать функции чтения токио?

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

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

read_until x, затем read_exact y, затем напишите ответ и вернитесь наверх.

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


person George    schedule 19.10.2018    source источник
comment
Это функции чтения здесь: docs.rs/tokio/0.1.11 /tokio/io/index.html   -  person George    schedule 19.10.2018
comment
Хотя я читал документацию по функциям, но из документации совершенно неясно, как на самом деле правильно связать их вместе.   -  person George    schedule 19.10.2018
comment
Отредактируйте свой пост и добавьте туда описание;) Вы публикуете это не для меня, а для всех, кто может наткнуться на ваш вопрос   -  person hellow    schedule 19.10.2018
comment
Я предполагаю, что большинству людей, которые могли бы ответить на этот вопрос, ссылка на документы не нужна: p ... но, w / e   -  person George    schedule 19.10.2018
comment
Не предполагайте того, чего вы не знаете;) Stackoverflow - это место для людей, которые ищут что-то в Google и начинают копаться. Чем больше вы проясните свой вопрос, тем больше вы сможете помочь людям. Вы предоставили документацию, поэтому человек, который ее читает, точно знает, какую версию вы используете и какой ящик вы использовали.   -  person hellow    schedule 19.10.2018


Ответы (1)


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

read_until возвращает структуру _ 2_, который реализует _ 3_ -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
        )
    );
}

Здесь я использую курсор, который реализует _6 _ -trait и используйте функцию read_until для чтения, пока не появится новая строка (между 'f' и 'g').
Затем, чтобы связать те, которые я использую and_then, чтобы использовать read_exact в случае успеха, используйте _ 12_, чтобы Result развернуть его (не делайте этого в production kids!) и беру второй аргумент из кортежа (первый - это курсор).
В последнюю очередь я конвертирую Vec в строку для отображения "gh" с println!.

person hellow    schedule 19.10.2018
comment
это не совсем то, что я ищу, так как в нем отсутствует рекурсивная часть. Я больше ищу что-то вроде Lines, где я могу применять функцию снова и снова к потоку данных, например, когда он достигает конца, он возвращается к началу, так сказать. Но ReadUntil и другие структуры, возвращаемые функциями чтения, не реализуют Stream аналогично строкам. - person George; 19.10.2018
comment
Если можете, я ищу что-то похожее на это: reddit.com / r / rust / comments / 75ftyj / Но с новым tokio, а не с tokio-core и старыми модулями - person George; 19.10.2018
comment
Тогда, пожалуйста, расширите свой ответ! Я прочитал вопрос как таковой, что вы не знаете, как связать read_until и read_exact. Рекурсивный способ как таковой не может существовать, потому что вы не можете вызывать замыкания рекурсивно. Почему вы не разместили эту ссылку (или пример) в своем вопросе, чтобы я знал, что вы ищете? - person hellow; 19.10.2018
comment
Потому что, если бы я мог найти пример, я бы не задавал вопрос ....: / - person George; 19.10.2018
comment
В приведенном выше примере используется tokio-rs, и я даже не уверен на 100%, что он делает то, что я намереваюсь сделать (например, он может закрыть соединение) - person George; 19.10.2018
comment
В любом случае, насколько я могу судить, подключение кодека, который находится непосредственно над MIO, кажется единственным способом сделать это на данный момент ... что немного глупо. Но, оставлю вопрос открытым, может, я что-то упускаю. Спасибо за попытку. - person George; 19.10.2018