chiark / gitweb /
Game updates: Break out clear_game
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 13 May 2021 08:52:20 +0000 (09:52 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 13 May 2021 09:07:47 +0000 (10:07 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs

index 2b057023b893219e98e3ca26310879db975bf7e9..5bc9c77fa376b8c3227b93d73e2a00723b972711 100644 (file)
@@ -444,6 +444,27 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
      Fine, None, vec![], ig)
   }
 
+  #[throws(MgmtError)]
+  fn clear_game<'igr, 'ig: 'igr, 'cs>(
+    cs: &'cs CommandStreamData,
+    ag: &'_ mut AccountsGuard,
+    ig: &'igr mut Unauthorised<InstanceGuard<'ig>, InstanceName>,
+  ) -> (&'igr mut InstanceGuard<'ig>, Vec<MgmtGameInstruction>)
+  {
+    let ig = cs.check_acl(&ag, ig, PCH::Instance, &[TP::ChangePieces])?.0;
+
+    // Clear out old stuff
+    let mut insns = vec![];
+    for alias in ig.pcaliases.keys() {
+      insns.push(MGI::DeletePieceAlias(alias.clone()));
+    }
+    for piece in ig.gs.pieces.keys() {
+      insns.push(MGI::DeletePiece(piece));
+    }
+
+    (ig, insns)
+  }
+
   impl<'cs> CommandStreamData<'cs> {
     #[throws(MgmtError)]
     fn check_acl_manip_player_access<'igr, 'ig: 'igr>(
@@ -542,7 +563,6 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
     },
 
     MGI::ResetFromGameSpec { spec_toml: spec } => {
-      let ig = cs.check_acl(&ag, ig, PCH::Instance, &[TP::ChangePieces])?.0;
       let spec: toml::Value = spec.parse()
         .map_err(|e: toml::de::Error| ME::TomlSyntaxError(e.to_string()))?;
       let GameSpec {
@@ -550,14 +570,7 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       } = toml_de::from_value(&spec)
         .map_err(|e: toml_de::Error| ME::TomlStructureError(e.to_string()))?;
 
-      // Clear out old stuff
-      let mut insns = vec![];
-      for alias in ig.pcaliases.keys() {
-        insns.push(MGI::DeletePieceAlias(alias.clone()));
-      }
-      for piece in ig.gs.pieces.keys() {
-        insns.push(MGI::DeletePiece(piece));
-      }
+      let (ig, mut insns) = clear_game(cs,ag,ig)?;
 
       // Define new stuff
       for (alias, target) in pcaliases.into_iter() {