chiark / gitweb /
Introduce and use PrepareUpdatesBuffer::only_unprepared_with
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 29 Apr 2022 23:05:35 +0000 (00:05 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 Apr 2022 10:02:54 +0000 (11:02 +0100)
This saves us writing `if unprepared.len() != 0`.  I think that
pattern is asking for a reversed conditional at one random site.

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

index 2ee41962ac23af6c6478d2de3ab3fc56f62bb62d..3bd816be2fceb8fc0fb54252f5e14c564a9d5621 100644 (file)
@@ -1337,12 +1337,10 @@ fn execute_for_game<'cs, 'igr, 'ig: 'igr>(
         assert!(expand.is_empty())
       }
       responses.push(resp);
-      if let Some(unprepared) = unprepared {
+      PrepareUpdatesBuffer::only_unprepared_with(unprepared, ||{
         st.flush(ig,how,&who)?;
-        let mut prepub = PrepareUpdatesBuffer::new(ig, None);
-        unprepared(&mut prepub);
-        prepub.finish();
-      }
+        Ok::<_,ME>(ig)
+      })?;
     }
     if let Some(ref mut st) = uh_auth {
       flush_uh(st,igu)?;
@@ -1370,12 +1368,9 @@ fn execute_for_game<'cs, 'igr, 'ig: 'igr>(
     })
   });
 
-  if let Some(uu) = uu {
-    let ig = igu.by_mut(Authorisation::promise_any());
-    let mut prepub = PrepareUpdatesBuffer::new(ig, None);
-    uu(&mut prepub);
-    prepub.finish();
-  }
+  PrepareUpdatesBuffer::only_unprepared_with(uu, ||Ok::<_,Void>(
+    igu.by_mut(Authorisation::promise_any())
+  )).void_unwrap();
 
   ok?
 }
index ba22714f132792e23b618ae1bcec51816641824e..ec2ab6bf6970710455ee92466301ae1459e43c5d 100644 (file)
@@ -826,9 +826,18 @@ impl<'r> PrepareUpdatesBuffer<'r> {
   }
 
   pub fn only_unprepared(ig: &'r mut Instance, unprepared: UnpreparedUpdates) {
-    if let Some(unprepared) = unprepared {
+    Self::only_unprepared_with(unprepared, ||Ok::<_,Void>(ig))
+      .void_unwrap();
+  }
+
+  #[throws(E)]
+  pub fn only_unprepared_with<'i,F,E>(unprepared: UnpreparedUpdates, igf: F)
+  where F: FnOnce() -> Result<&'i mut Instance, E>
+  {
+    if unprepared.is_some() {
+      let ig = igf()?;
       let mut prepub = PrepareUpdatesBuffer::new(ig, None);
-      unprepared(&mut prepub);
+      prepub.add_unprepared(unprepared);
       prepub.finish();
     }
   }