From: Ian Jackson Date: Fri, 19 Mar 2021 00:20:13 +0000 (+0000) Subject: clock: implement ui_operation X-Git-Tag: otter-0.5.0~646 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=b58f80c1753e5e7a086eebc6d393ae0262f9d527;p=otter.git clock: implement ui_operation Signed-off-by: Ian Jackson --- diff --git a/src/clock.rs b/src/clock.rs index 037eb7c3..96bf5c78 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -391,5 +391,66 @@ impl PieceTrait for Clock { } } + #[throws(ApiPieceOpError)] + fn ui_operation(&self, args: ApiPieceOpArgs<'_>, + opname: &str, _wrc: WhatResponseToClientOp) + -> UpdateFromOpComplex { + let ApiPieceOpArgs { gs,piece,player,ioccults,ipc, .. } = args; + let gpc = gs.pieces.byid_mut(piece)?; + let gpl = gs.players.byid(player)?; + let state: &mut State = gpc.xdata_mut_exp() + .map_err(|e| APOE::ReportViaResponse(e.into()))?; + let get_user = || opname.chars().next_back().unwrap().try_into().unwrap(); + + let log = Html::lit("xxxx"); + // xxx + match opname { + "start-x" | "start-y" => { + let user = get_user(); + state.current = Some(Current { user }); + }, + "stop" => { + state.current = None; + }, + "reset" => { + if state.current.is_some() { + throw!(OE::BadOperation); + } + for ust in &mut state.users { + ust.remaining = self.spec.initial_time(); + } + }, + "claim-x" | "claim-y" => { + let user = get_user(); + if let Some(_gpl) = gs.players.get(state.users[user].player) { + throw!(OE::BadOperation); + } + state.users[user].player = player; + }, + "unclaim-x" | "unclaim-y" => { + let user = get_user(); + if state.users[user].player != player { + throw!(OE::BadOperation); + } + state.users[user].player = default(); + }, + _ => { + throw!(OE::BadOperation); + } + } + + let log = log_did_to_piece(ioccults, gpl, gpc, ipc, &log.0) + .unwrap_or_else(|e| { + error!("failed to log: {:?}", &e); + vec![LogEntry { html: Html::lit("<failed to log>") }] + }); + let r: PieceUpdateFromOpSimple = + (WhatResponseToClientOp::UpdateSvg, + PieceUpdateOp::Modify(()), + log); + + (r.into(), vec![], None) + } + fn itemname(&self) -> &str { "chess-clock" } }