Как превратить таймаут в ошибку?

Есть tokio::Stream<Item = u8> и Future<Item = ()>. Они объединены через select. Future<Item = ()> это глобальный таймаут. Он сейчас приходит как Ok(()). Как его превратить в Err(TimedOut) чтобы select прервался?

#[derive(Debug)]
enum Unified {
    U8(u8),
    Timeout(()),
}
...
            let stdout = child.stdout().take().unwrap();
            let mut timeout_reader = TimeoutReader::new(stdout, &core.handle());
            timeout_reader.set_timeout(Some(Duration::from_secs(20)));

            let global_timeout = tokio_core::reactor::Timeout::new(Duration::from_secs(10), &core.handle()).unwrap();
            let timeout_stream = global_timeout.into_stream();
            let timeout_stream = timeout_stream.map(Unified::Timeout);

            ...
            let read_stream = read_stream.map(Unified::U8);
            let joined_stream = read_stream.select(timeout_stream);
            let mut iter = joined_stream.wait();

Сделал так:


            let global_timeout = poll_fn(move || -> Poll<Option<u8>, std::io::Error> {
                let timeout_poll = global_timeout.poll();
                match timeout_poll {
                    Ok(Async::Ready(())) => Err(std::io::Error::from(std::io::ErrorKind::TimedOut)),
                    Ok(Async::NotReady) => Ok(Async::NotReady),
                    Err(e) => Err(e),
                }
            });
1 лайк

Достаточно сделать global_timeout.then(|_|Err(()))

1 лайк