From b037dec27f3ba0060b9b5735f6d06f01b4edc694 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 11 Mar 2021 17:46:25 +0000 Subject: [PATCH] fake rng: prep for set() Signed-off-by: Ian Jackson --- src/commands.rs | 1 + src/fake-rng.rs | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 72fd60e0..feb40d61 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -186,6 +186,7 @@ pub enum MgmtError { BadSpec(#[from] SpecError), TokenDeliveryFailed(#[from] TokenDeliveryError), CoordinateOverflow(#[from] CoordinateOverflow), + RngIsReal, } impl Display for MgmtError { #[throws(fmt::Error)] diff --git a/src/fake-rng.rs b/src/fake-rng.rs index 0904b080..06284f2c 100644 --- a/src/fake-rng.rs +++ b/src/fake-rng.rs @@ -13,34 +13,39 @@ pub struct FakeRngSpec(Vec); impl FakeRngSpec { pub fn start(self) -> RngWrap { RngWrap( if self.0.is_empty() { None } - else { Some(Arc::new(FakeRng { - i: Mutex::new(0), + else { Some(Arc::new(Mutex::new(FakeRng { + i: 0, ents: self.0, - })) } + }))) } )} } #[derive(Debug,Clone)] pub struct RngWrap ( - Option> + Option>> ); #[derive(Debug)] struct FakeRng { - i: Mutex, + i: usize, ents: Vec, } impl RngWrap { pub fn is_fake(&self) -> bool { self.0.is_some() } + #[throws(MgmtError)] + pub fn set(&self, v: Vec, _: AuthorisationSuperuser) { + let mut fake = self.0.as_ref().ok_or(ME::RngIsReal)?.lock(); + fake.i = 0; + fake.ents = v; + } + #[throws(as Option)] - fn next(&self) -> &str { - let fake = self.0.as_ref()?; - let mut i = fake.i.lock(); - let e = fake.ents[*i].as_str(); - *i += 1; - *i %= fake.ents.len(); + fn next(&self) -> String { + let mut fake = self.0.as_ref()?.lock(); + let e = fake.ents.get(fake.i)?.clone(); + fake.i += 1; e } -- 2.30.2