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