From: Ian Jackson Date: Sun, 24 Apr 2022 21:47:15 +0000 (+0100) Subject: fake time: Fix config deserialisation X-Git-Tag: otter-1.1.0~451 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=fa21fb0f35620e256fc178542f95f035f5ba6be5;p=otter.git fake time: Fix config deserialisation Option works weirdly, empirically. This (via a Vec) is what we want. Signed-off-by: Ian Jackson --- diff --git a/src/fake-time.rs b/src/fake-time.rs index c28bcaab..c71109c2 100644 --- a/src/fake-time.rs +++ b/src/fake-time.rs @@ -14,9 +14,31 @@ type Micros = u64; pub struct FakeTimeConfig(Option); #[derive(Deserialize,Serialize,Debug,Clone,Default)] -#[serde(transparent)] +#[serde(into="Vec", try_from="Vec")] pub struct FakeTimeSpec(Option); +#[derive(Error,Debug)] +#[error("invalid fake time: must be list of 0 or 1 numbers (ms)")] +pub struct InvalidFakeTime; + +impl TryFrom> for FakeTimeSpec { + type Error = InvalidFakeTime; + #[throws(InvalidFakeTime)] + fn try_from(l: Vec) -> FakeTimeSpec { + FakeTimeSpec(match &*l { + [] => None, + &[ms] => Some(ms), + _ => throw!(InvalidFakeTime), + }) + } +} + +impl Into> for FakeTimeSpec { + fn into(self) -> Vec { + self.0.into_iter().collect() + } +} + #[derive(Debug)] pub struct GlobalClock { fakeable: Option>>,