1 use crate::clocks::{WasiClocks, WasiMonotonicClock, WasiSystemClock};
2 use cap_std::time::{Duration, Instant, SystemTime};
3 use cap_std::{AmbientAuthority, ambient_authority};
4 use cap_time_ext::{MonotonicClockExt, SystemClockExt};
5 
6 pub struct SystemClock(cap_std::time::SystemClock);
7 
8 impl SystemClock {
new(ambient_authority: AmbientAuthority) -> Self9     pub fn new(ambient_authority: AmbientAuthority) -> Self {
10         SystemClock(cap_std::time::SystemClock::new(ambient_authority))
11     }
12 }
13 impl WasiSystemClock for SystemClock {
resolution(&self) -> Duration14     fn resolution(&self) -> Duration {
15         self.0.resolution()
16     }
now(&self, precision: Duration) -> SystemTime17     fn now(&self, precision: Duration) -> SystemTime {
18         self.0.now_with(precision)
19     }
20 }
21 
22 pub struct MonotonicClock(cap_std::time::MonotonicClock);
23 impl MonotonicClock {
new(ambient_authority: AmbientAuthority) -> Self24     pub fn new(ambient_authority: AmbientAuthority) -> Self {
25         MonotonicClock(cap_std::time::MonotonicClock::new(ambient_authority))
26     }
27 }
28 impl WasiMonotonicClock for MonotonicClock {
resolution(&self) -> Duration29     fn resolution(&self) -> Duration {
30         self.0.resolution()
31     }
now(&self, precision: Duration) -> Instant32     fn now(&self, precision: Duration) -> Instant {
33         self.0.now_with(precision)
34     }
35 }
36 
clocks_ctx() -> WasiClocks37 pub fn clocks_ctx() -> WasiClocks {
38     WasiClocks::new()
39         .with_system(SystemClock::new(ambient_authority()))
40         .with_monotonic(MonotonicClock::new(ambient_authority()))
41 }
42