Crate timeout_readwrite
source ·Expand description
Provides TimeoutReader
and TimeoutWriter
structs to time out reads and
writes, respectively. TimeoutReader
implements Read
and TimeoutWriter
implements Write
. If any operation times out, the method called will return
an io::ErrorKind::TimedOut
variant as the value of io::Error
. All other
error values that would normally be produced by the underlying implementation
of the Read
or Write
trait could also be produced by the TimeoutReader
and
TimeoutWriter
structs.
Example: read from a process with a 5-second timeout
Given a process that writes to standard out, read from the output once it is there, but fail if you have to wait longer than 5-seconds for data to be present on standard out.
use std::io::{ErrorKind, Read, Result};
use std::process;
use std::time::Duration;
use timeout_readwrite::TimeoutReader;
fn read_command(mut cmd: process::Command) -> Result<String> {
let child = cmd.stdout(process::Stdio::piped())
.stderr(process::Stdio::null())
.spawn()
.expect("spawing did not succeed");
let stdout = child.stdout.expect("stdout must be there");
let mut data = String::new();
let mut rdr = TimeoutReader::new(stdout, Duration::new(5, 0));
rdr.read_to_string(&mut data)?;
Ok(data)
}
match read_command(process::Command::new("ls")) {
Ok(value) => { print!("{}", value); },
Err(ref e) if e.kind() == ErrorKind::TimedOut => { println!("timed out!"); },
Err(ref e) => { println!("failed reading with {}", e); },
}
Example: use the TimeoutReadExt trait
Use the TimeoutReadExt trait to provide a simple helper method to creating a TimeoutReader.
use std::io::{ErrorKind, Read, Result};
use std::process;
use std::time::Duration;
use timeout_readwrite::TimeoutReadExt;
fn read_command(mut cmd: process::Command) -> Result<String> {
let child = cmd.stdout(process::Stdio::piped())
.stderr(process::Stdio::null())
.spawn()
.expect("spawing did not succeed");
let stdout = child.stdout.expect("stdout must be there");
let mut data = String::new();
stdout.with_timeout(Duration::new(5, 0)).read_to_string(&mut data)?;
Ok(data)
}
match read_command(process::Command::new("ls")) {
Ok(value) => { print!("{}", value); },
Err(ref e) if e.kind() == ErrorKind::TimedOut => { println!("timed out!"); },
Err(ref e) => { println!("failed reading with {}", e); },
}
Re-exports
pub use reader::TimeoutReadExt;
pub use reader::TimeoutReader;
pub use writer::TimeoutWriteExt;
pub use writer::TimeoutWriter;