From 8d6b9343e06e97da5238b24db938e2d961a9735c Mon Sep 17 00:00:00 2001 From: Ryan P Date: Mon, 22 Dec 2025 15:45:12 -0500 Subject: [PATCH 1/3] SystemTime::duration_since and UNIX_EPOCH --- src/time/mod.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/time/mod.rs b/src/time/mod.rs index ff99832..2b94f9b 100644 --- a/src/time/mod.rs +++ b/src/time/mod.rs @@ -13,7 +13,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; use wasip2::clocks::{ monotonic_clock::{subscribe_duration, subscribe_instant}, - wall_clock, + wall_clock::{self, Datetime}, }; use crate::{ @@ -28,11 +28,30 @@ use crate::{ pub struct SystemTime(wall_clock::Datetime); impl SystemTime { + pub const UNIX_EPOCH: SystemTime = SystemTime(Datetime { + seconds: 0, + nanoseconds: 0, + }); + pub fn now() -> Self { Self(wall_clock::now()) } + + pub fn duration_since(&self, earlier: &SystemTime) -> Result { + if self.0.seconds >= earlier.0.seconds { + if self.0.nanoseconds >= earlier.0.nanoseconds { + return Ok(Duration::new( + self.0.seconds - earlier.0.seconds, + self.0.nanoseconds - earlier.0.nanoseconds, + )); + } + } + Err(SystemTimeError()) + } } +pub struct SystemTimeError(); + /// An async iterator representing notifications at fixed interval. pub fn interval(duration: Duration) -> Interval { Interval { duration } @@ -113,6 +132,18 @@ mod test { println!("{what} awaited for {} s", d.as_secs_f32()); } + #[test] + fn systemtime() { + crate::runtime::block_on(async { + let earlier = SystemTime::UNIX_EPOCH; + let now = SystemTime::now(); + + assert!(now.duration_since(&earlier).is_ok()); + assert!(now.duration_since(&now).is_ok_and(|x| x.as_secs() == 0)); + assert!(earlier.duration_since(&now).is_err()); + }); + } + #[test] fn timer_now() { crate::runtime::block_on(debug_duration("timer_now", async { From bad5750fae6a59abcd355da33772cf4f41167286 Mon Sep 17 00:00:00 2001 From: Ryan P Date: Mon, 22 Dec 2025 16:07:33 -0500 Subject: [PATCH 2/3] clippy: collapse nested if --- src/time/mod.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/time/mod.rs b/src/time/mod.rs index 2b94f9b..f4b4bf5 100644 --- a/src/time/mod.rs +++ b/src/time/mod.rs @@ -38,19 +38,18 @@ impl SystemTime { } pub fn duration_since(&self, earlier: &SystemTime) -> Result { - if self.0.seconds >= earlier.0.seconds { - if self.0.nanoseconds >= earlier.0.nanoseconds { - return Ok(Duration::new( - self.0.seconds - earlier.0.seconds, - self.0.nanoseconds - earlier.0.nanoseconds, - )); - } + if self.0.seconds >= earlier.0.seconds && self.0.nanoseconds >= earlier.0.nanoseconds { + return Ok(Duration::new( + self.0.seconds - earlier.0.seconds, + self.0.nanoseconds - earlier.0.nanoseconds, + )); } - Err(SystemTimeError()) + + Err(SystemTimeError) } } -pub struct SystemTimeError(); +pub struct SystemTimeError; /// An async iterator representing notifications at fixed interval. pub fn interval(duration: Duration) -> Interval { @@ -133,7 +132,7 @@ mod test { } #[test] - fn systemtime() { + fn systemtime_duration_since() { crate::runtime::block_on(async { let earlier = SystemTime::UNIX_EPOCH; let now = SystemTime::now(); From b42b1a84ce575455c08b1caa509a780b21274f2a Mon Sep 17 00:00:00 2001 From: Ryan P Date: Mon, 22 Dec 2025 16:23:38 -0500 Subject: [PATCH 3/3] SystemTimeError should implement debug, copy earlier --- src/time/mod.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/time/mod.rs b/src/time/mod.rs index f4b4bf5..a309900 100644 --- a/src/time/mod.rs +++ b/src/time/mod.rs @@ -37,7 +37,7 @@ impl SystemTime { Self(wall_clock::now()) } - pub fn duration_since(&self, earlier: &SystemTime) -> Result { + pub fn duration_since(&self, earlier: SystemTime) -> Result { if self.0.seconds >= earlier.0.seconds && self.0.nanoseconds >= earlier.0.nanoseconds { return Ok(Duration::new( self.0.seconds - earlier.0.seconds, @@ -49,6 +49,7 @@ impl SystemTime { } } +#[derive(Debug, Clone, Copy)] pub struct SystemTimeError; /// An async iterator representing notifications at fixed interval. @@ -137,9 +138,9 @@ mod test { let earlier = SystemTime::UNIX_EPOCH; let now = SystemTime::now(); - assert!(now.duration_since(&earlier).is_ok()); - assert!(now.duration_since(&now).is_ok_and(|x| x.as_secs() == 0)); - assert!(earlier.duration_since(&now).is_err()); + assert!(now.duration_since(earlier).is_ok()); + assert!(now.duration_since(now).is_ok_and(|x| x.as_secs() == 0)); + assert!(earlier.duration_since(now).is_err()); }); }