From: Ian Jackson Date: Thu, 13 May 2021 09:04:29 +0000 (+0100) Subject: Game updates: Make reset_game from clear_game X-Git-Tag: otter-0.6.0~318 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=677547bdd532a23d7280344e02cf0d280fea6cb1;p=otter.git Game updates: Make reset_game from clear_game Signed-off-by: Ian Jackson --- diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index 5bc9c77f..1eb5e218 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -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, InstanceName>, - ) -> (&'igr mut InstanceGuard<'ig>, Vec) + f: Box) + -> Result + '_> + ) -> 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) => {