GamesList { games }
},
- AlterGame { name, insns, how} => {
+ MgmtCommand::AlterGame { name, insns, how} => {
let name = InstanceName {
scope: cs.get_scope()?.clone(),
scoped_name: name
fn execute_for_game(cs: &CommandStream, ig: &mut InstanceGuard,
mut insns: Vec<MgmtGameInstruction>,
how: MgmtGameUpdateMode) -> MgmtResponse {
- let mut insns = insns.drain(0..).zip(0..);
let mut uh = UpdateHandler::from_how(how);
- let response = 'subcommands: loop {
-
- let (insn, index) = match insns.next() {
- None => break 'subcommands Fine { },
- Some(r) => r,
- };
-
- let (upieces, ulogs) = match execute_game_insn(&mut ig.gs, insn) {
- Err(e) => break 'subcommands ErrorAfter { successes: index, error: e },
- Ok(r) => r,
- };
-
- uh.accumulate(ig, upieces, ulogs)?;
-
- };
-
- uh.complete(cs,ig)?;
- response
+ let mut results = Vec::with_capacity(insns.len());
+ let ok = (||{
+ for insn in insns.drain(0..) {
+ let (upieces, ulogs, resp) = execute_game_insn(&mut ig.gs, insn)?;
+ uh.accumulate(ig, upieces, ulogs)?;
+ results.push(resp);
+ }
+ uh.complete(cs,ig)?;
+ Ok(None)
+ })();
+ MgmtResponse::AlterGame {
+ results,
+ error: ok.unwrap_or_else(|e| Some(e))
+ }
}
const XXX_START_POS : Pos = [20,20];
#[throws(ME)]
fn execute_game_insn(gs: &mut GameState, update: MgmtGameInstruction)
- -> (Vec<(PieceId,PieceUpdateOp<()>)>, Vec<LogEntry>) {
+ ->
+ (Vec<(PieceId,PieceUpdateOp<()>)>,
+ Vec<LogEntry>,
+ MgmtGameResult,
+ ) {
use MgmtGameInstruction::*;
+ use MgmtGameResult::*;
match update {
- Noop { } => (vec![], vec![]),
+ Noop { } => (vec![], vec![], Fine { }),
AddPiece(PiecesSpec{ pos,posd,count,face,info }) => {
let count = count.unwrap_or(1);
(updates, vec![ LogEntry {
html: format!("The facilitaror added {} pieces", count),
- }])
+ }],
+ Fine { }
+ )
},
}
}
pub enum MgmtResponse {
Fine { },
Error { error: MgmtError },
- ErrorAfter { successes: usize, error: MgmtError },
+ AlterGame { error: Option<MgmtError>, results: Vec<MgmtGameResult> },
GamesList { games: Vec<Arc<InstanceName>> },
}
+#[derive(Debug,Serialize,Deserialize)]
+pub enum MgmtGameResult {
+ Fine { },
+ AddPlayer { player: PlayerId },
+}
+
#[derive(Debug,Serialize,Deserialize)]
pub enum MgmtGameUpdateMode {
Online,