// TODO: document use std::io; use std::time::Duration; use anyhow::{bail, Result}; use futures::future::{select, Either}; use futures::io::BufReader; use futures::prelude::*; use smol::Timer; async fn timeout(dur: Duration, f: impl Future>) -> io::Result { futures::select! { out = f.fuse() => out, _ = Timer::after(dur).fuse() => { Err(io::Error::from(io::ErrorKind::TimedOut)) } } } fn main() -> Result<()> { smol::run(async { let mut line = String::new(); let mut stdin = BufReader::new(smol::reader(std::io::stdin())); timeout(Duration::from_secs(5), stdin.read_line(&mut line)).await?; println!("Line: {}", line); Ok(()) }) }