use std::time::{Duration, Instant};
#[derive(Debug, PartialEq)]
enum TimeoutState {
Active,
Inactive,
Expired,
}
#[derive(Debug)]
pub struct Timeout {
state: TimeoutState,
duration: Duration,
start: Instant,
}
impl Timeout {
pub fn new(duration: Duration) -> Self {
Timeout {
state: TimeoutState::Inactive,
duration,
start: Instant::now(),
}
}
pub fn check_expired(&mut self) -> bool {
if self.state == TimeoutState::Active && Instant::now() - self.start > self.duration {
self.state = TimeoutState::Expired;
}
match self.state {
TimeoutState::Active | TimeoutState::Inactive => false,
TimeoutState::Expired => true,
}
}
pub fn start(&mut self) {
self.state = TimeoutState::Active;
self.start = Instant::now();
}
pub fn stop(&mut self) {
self.state = TimeoutState::Inactive;
}
}