chiark / gitweb /
fake rng: prep for set()
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 17:46:25 +0000 (17:46 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 11 Mar 2021 18:46:05 +0000 (18:46 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/commands.rs
src/fake-rng.rs

index 72fd60e0008dda3f20425cf621d4bd887df52863..feb40d612594cd393b086856d7d43cc397e8c4f6 100644 (file)
@@ -186,6 +186,7 @@ pub enum MgmtError {
   BadSpec(#[from] SpecError),
   TokenDeliveryFailed(#[from] TokenDeliveryError),
   CoordinateOverflow(#[from] CoordinateOverflow),
+  RngIsReal,
 }
 impl Display for MgmtError {
   #[throws(fmt::Error)]
index 0904b08042274a21112bfc19e9fc09e2b25257cf..06284f2cfbe9fc712a02168c085686e7fc500761 100644 (file)
@@ -13,34 +13,39 @@ pub struct FakeRngSpec(Vec<String>);
 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<Arc<FakeRng>>
+  Option<Arc<Mutex<FakeRng>>>
 );
 
 #[derive(Debug)]
 struct FakeRng {
-  i: Mutex<usize>,
+  i: usize,
   ents: Vec<String>,
 }
 
 impl RngWrap {
   pub fn is_fake(&self) -> bool { self.0.is_some() }
 
+  #[throws(MgmtError)]
+  pub fn set(&self, v: Vec<String>, _: 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
   }