use std::io;
use std::time::Instant;
pub trait Read: io::Read {
fn set_read_deadline(&mut self, deadline: Option<Instant>) -> io::Result<()>;
}
impl<T: Read + ?Sized> Read for &mut T {
fn set_read_deadline(&mut self, deadline: Option<Instant>) -> io::Result<()> {
(**self).set_read_deadline(deadline)
}
}
impl<T: Read + ?Sized> Read for Box<T> {
fn set_read_deadline(&mut self, deadline: Option<Instant>) -> io::Result<()> {
(**self).set_read_deadline(deadline)
}
}
pub trait Write: io::Write {
fn set_write_deadline(&mut self, deadline: Instant) -> io::Result<()>;
}
impl<T: Write + ?Sized> Write for &mut T {
fn set_write_deadline(&mut self, deadline: Instant) -> io::Result<()> {
(**self).set_write_deadline(deadline)
}
}
impl<T: Write + ?Sized> Write for Box<T> {
fn set_write_deadline(&mut self, deadline: Instant) -> io::Result<()> {
(**self).set_write_deadline(deadline)
}
}
pub(super) fn check_deadline(deadline: Instant) -> io::Result<()> {
if Instant::now() >= deadline {
Err(io::Error::new(
io::ErrorKind::TimedOut,
"I/O deadline expired",
))
} else {
Ok(())
}
}