use cap_primitives::time::{Duration, Instant, SystemTime};
use wasi_common::clocks::{WasiClocks, WasiMonotonicClock, WasiSystemClock};
const TIMER_RESOLUTION_MS: u64 = 0;
pub fn new_clocks() -> WasiClocks {
let instant = Instant::from_std(std::time::Instant::now());
WasiClocks::new()
.with_system(DeterministicSystemClock::new())
.with_monotonic(DeterministicMonotonicClock::new(instant))
}
struct DeterministicSystemClock {
stubbed_time: SystemTime,
}
impl DeterministicSystemClock {
pub fn new() -> DeterministicSystemClock {
let stubbed_time = SystemTime::from_std(std::time::UNIX_EPOCH);
DeterministicSystemClock { stubbed_time }
}
}
impl WasiSystemClock for DeterministicSystemClock {
fn resolution(&self) -> Duration {
Duration::from_millis(TIMER_RESOLUTION_MS)
}
fn now(&self, _precision: Duration) -> SystemTime {
self.stubbed_time
}
}
struct DeterministicMonotonicClock {
instant: Instant,
}
impl DeterministicMonotonicClock {
pub fn new(instant: Instant) -> DeterministicMonotonicClock {
DeterministicMonotonicClock { instant }
}
}
impl WasiMonotonicClock for DeterministicMonotonicClock {
fn resolution(&self) -> Duration {
Duration::from_millis(TIMER_RESOLUTION_MS)
}
fn now(&self, _precision: Duration) -> Instant {
self.instant
}
}