chiark / gitweb /
Game updates: Make reset_game from clear_game
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 13 May 2021 09:04:29 +0000 (10:04 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 13 May 2021 09:08:10 +0000 (10:08 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs

index 5bc9c77fa376b8c3227b93d73e2a00723b972711..1eb5e2180ca43c473c28d8eecd9cd83e8d4529f0 100644 (file)
@@ -445,11 +445,13 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
   }
 
   #[throws(MgmtError)]
-  fn clear_game<'igr, 'ig: 'igr, 'cs>(
+  fn reset_game<'igr, 'ig: 'igr, 'cs>(
     cs: &'cs CommandStreamData,
     ag: &'_ mut AccountsGuard,
     ig: &'igr mut Unauthorised<InstanceGuard<'ig>, InstanceName>,
-  ) -> (&'igr mut InstanceGuard<'ig>, Vec<MgmtGameInstruction>)
+    f: Box<dyn FnOnce(&mut InstanceGuard, &mut Vec<MgmtGameInstruction>)
+                      -> Result<LogEntry, MgmtError> + '_>
+  ) -> ExecuteGameInsnResults<'igr, 'ig>
   {
     let ig = cs.check_acl(&ag, ig, PCH::Instance, &[TP::ChangePieces])?.0;
 
@@ -462,7 +464,13 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       insns.push(MGI::DeletePiece(piece));
     }
 
-    (ig, insns)
+    let logent = f(ig, &mut insns)?;
+
+    (U{ pcs: vec![],
+        log: vec![ logent ],
+        raw: None },
+     MGR::InsnExpanded,
+     None, insns, ig)
   }
 
   impl<'cs> CommandStreamData<'cs> {
@@ -570,24 +578,20 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       } = toml_de::from_value(&spec)
         .map_err(|e: toml_de::Error| ME::TomlStructureError(e.to_string()))?;
 
-      let (ig, mut insns) = clear_game(cs,ag,ig)?;
-
-      // Define new stuff
-      for (alias, target) in pcaliases.into_iter() {
-        insns.push(MGI::DefinePieceAlias{ alias, target });
-      }
-      insns.push(MGI::ClearLog);
-      insns.push(MGI::SetTableSize(table_size));
-      insns.push(MGI::SetTableColour(table_colour));
-      for pspec in pieces.into_iter() {
-        insns.push(MGI::AddPieces(pspec));
-      }
-      let html = hformat!("{} reset the game", &who);
-      (U{ pcs: vec![],
-          log: vec![ LogEntry { html } ],
-          raw: None },
-       MGR::InsnExpanded,
-       None, insns, ig)
+      reset_game(cs,ag,ig, Box::new(|_ig, insns|{
+        // Define new stuff:
+        for (alias, target) in pcaliases.into_iter() {
+          insns.push(MGI::DefinePieceAlias{ alias, target });
+        }
+        insns.push(MGI::ClearLog);
+        insns.push(MGI::SetTableSize(table_size));
+        insns.push(MGI::SetTableColour(table_colour));
+        for pspec in pieces.into_iter() {
+          insns.push(MGI::AddPieces(pspec));
+        }
+        let html = hformat!("{} reset the game", &who);
+        Ok(LogEntry { html })
+      }))?
     }
 
     MGI::InsnMark(token) => {