chiark / gitweb /
fake time: Fix config deserialisation
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 24 Apr 2022 21:47:15 +0000 (22:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 25 Apr 2022 00:14:28 +0000 (01:14 +0100)
Option works weirdly, empirically.  This (via a Vec) is what we want.

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

index c28bcaab07a0b0142f656591f461774307e62630..c71109c27c2f39341ffdee4365f7b6679b8240c1 100644 (file)
@@ -14,9 +14,31 @@ type Micros = u64;
 pub struct FakeTimeConfig(Option<FakeTimeSpec>);
 
 #[derive(Deserialize,Serialize,Debug,Clone,Default)]
-#[serde(transparent)]
+#[serde(into="Vec<Millis>", try_from="Vec<Millis>")]
 pub struct FakeTimeSpec(Option<Millis>);
 
+#[derive(Error,Debug)]
+#[error("invalid fake time: must be list of 0 or 1 numbers (ms)")]
+pub struct InvalidFakeTime;
+
+impl TryFrom<Vec<Millis>> for FakeTimeSpec {
+  type Error = InvalidFakeTime;
+  #[throws(InvalidFakeTime)]
+  fn try_from(l: Vec<Millis>) -> FakeTimeSpec {
+    FakeTimeSpec(match &*l {
+      [] => None,
+      &[ms] => Some(ms),
+      _ => throw!(InvalidFakeTime),
+    })
+  }
+}
+
+impl Into<Vec<Millis>> for FakeTimeSpec {
+  fn into(self) -> Vec<Millis> {
+    self.0.into_iter().collect()
+  }
+}
+
 #[derive(Debug)]
 pub struct GlobalClock {
   fakeable: Option<Mutex<Option<FakeClock>>>,