use std::time::{Duration, Instant}; #[derive(Clone, Copy, Debug)] pub(crate) struct Timeout { timeout: Option, start: Instant, } impl Timeout { pub(crate) fn new(timeout: Option) -> Self { Self { timeout, start: Instant::now() } } pub(crate) fn elapsed(&self) -> bool { self.timeout.map(|timeout| self.start.elapsed() >= timeout).unwrap_or(false) } pub(crate) fn leftover(&self) -> Option { self.timeout.map(|timeout| { let elapsed = self.start.elapsed(); timeout.checked_sub(elapsed).unwrap_or(Duration::ZERO) }) } }