Да, есть способ.
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!
.