From 77795acc531045a54ec2e9d29b51c42335b1e7a3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 16 Mar 2021 22:30:00 +0000 Subject: [PATCH] Support held_change_hook Signed-off-by: Ian Jackson --- daemon/api.rs | 20 ++++++++++++++++++++ src/gamestate.rs | 8 ++++++++ src/hidden.rs | 4 ++++ 3 files changed, 32 insertions(+) diff --git a/daemon/api.rs b/daemon/api.rs index 2d130446..50e8e94c 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -121,6 +121,7 @@ fn api_piece_op(form: Json>) let gpl = gs.players.byid(player)?; let piece = vpiece_decode(gs, player, gpl, form.piece) .ok_or(OE::PieceGone)?; + let was_held = gs.pieces.get(piece).as_ref().map(|gpc| gpc.held); use ApiPieceOpError::*; match (||{ @@ -174,11 +175,30 @@ fn api_piece_op(form: Json>) } }; + if let Some(unprepared) = if_chain! { + let g = &mut *ig; + if let Some(was_held) = was_held; + if let Some(gpc) = g.gs.pieces.get_mut(piece); + if gpc.held != was_held; + if let Some(ipc) = &g.ipieces.get(piece); + if let Ok(unprepared) = ipc.direct_trait_access().held_change_hook( + &mut g.gs.pieces, + was_held, + ).map_err(|e| error!("internal error on change hook: {:?}", e)); + then { unprepared } + else { None } + } { + let mut prepub = PrepareUpdatesBuffer::new(&mut ig, None, None); + unprepared(&mut prepub); + prepub.finish(); + } + Ok::<(),OE>(()) })(); let g = &mut *ig; let gs = &mut g.gs; + (r, to_permute.implement(&mut gs.players, &mut gs.pieces, &mut gs.occults, diff --git a/src/gamestate.rs b/src/gamestate.rs index c20bde3a..548f862d 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -142,6 +142,14 @@ pub trait PieceTrait: OutlineTrait + Send + Debug + 'static { fn describe_html(&self, gpc: &GPiece) -> Result; + #[throws(IE)] + /// Piece is responsible for dealing with the possibility that they + /// may be occulted! + fn held_change_hook(&self, + _gpieces: &mut GPieces, + _was_held: Option) + -> UnpreparedUpdates { None } + fn delete_hook(&self, _p: &GPiece, _gs: &mut GameState) -> ExecuteGameChangeUpdates { ExecuteGameChangeUpdates{ pcs: vec![], log: vec![], raw: None } diff --git a/src/hidden.rs b/src/hidden.rs index 9365bba1..47497751 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -245,6 +245,10 @@ impl IPieceTraitObj { } pub fn into_inner(self) -> Box { self.0 } + + pub fn direct_trait_access(&self) -> &Box { + &self.0 + } } impl IPiece { -- 2.30.2