use futures::{FutureExt as _, future::BoxFuture};
use omaha_client::time::{PartialComplexTime, Timer};
use std::time::{Duration, SystemTime};
pub struct MinimalTimer;
impl MinimalTimer {
fn duration_until_system_time(system: SystemTime) -> Duration {
system
.duration_since(SystemTime::now())
.ok()
.unwrap_or(Duration::from_secs(0))
}
fn duration_until_instant(instant: std::time::Instant) -> Duration {
instant
.checked_duration_since(std::time::Instant::now())
.unwrap_or(Duration::from_secs(0))
}
}
impl Timer for MinimalTimer {
fn wait_until(&mut self, time: impl Into<PartialComplexTime>) -> BoxFuture<'static, ()> {
let t: PartialComplexTime = time.into();
let duration = match t {
PartialComplexTime::Wall(w) => Self::duration_until_system_time(w),
PartialComplexTime::Monotonic(m) => Self::duration_until_instant(m),
PartialComplexTime::Complex(c) => core::cmp::min(
Self::duration_until_system_time(c.wall),
Self::duration_until_instant(c.mono),
),
};
tokio::time::sleep(duration).boxed()
}
fn wait_for(&mut self, duration: Duration) -> BoxFuture<'static, ()> {
tokio::time::sleep(duration).boxed()
}
}