chiark / gitweb /
Provide FutureTimeInstant, for use by dice
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Apr 2022 09:56:27 +0000 (10:56 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Apr 2022 21:42:29 +0000 (22:42 +0100)
This loads and saves as a Duration.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/utils.rs

index cfaafb3705fa747d593ed6f1dd734d1703506c7d..5f852b3f1d2a19e17571548c808556b24385d7d4 100644 (file)
@@ -443,6 +443,33 @@ entry_define_insert_remove!{
   key
 }
 
+#[derive(Debug,Copy,Clone,Eq,PartialEq,Ord,PartialOrd)]
+#[derive(From,Into)]
+#[derive(Serialize, Deserialize)]
+#[serde(into="Duration", try_from="Duration")]
+pub struct FutureInstant(pub Instant);
+
+impl Into<Duration> for FutureInstant {
+  fn into(self) -> Duration {
+    let now = Instant::now();
+    Instant::from(self).checked_duration_since(now).unwrap_or_default()
+  }
+}
+
+#[derive(Error,Debug)]
+#[error("Duration (eg during load) implies out-of-range FutureInstant")]
+pub struct FutureInstantOutOfRange;
+
+impl TryFrom<Duration> for FutureInstant {
+  type Error = FutureInstantOutOfRange;
+  #[throws(FutureInstantOutOfRange)]
+  fn try_from(duration: Duration) -> FutureInstant {
+    let now = Instant::now();
+    now.checked_add(duration).ok_or(FutureInstantOutOfRange)?.into()
+  }
+}      
+
+
 #[derive(Debug,Copy,Clone)]
 pub struct DigestRead<D: Digest, R: Read> {
   d: D,