From: Ian Jackson Date: Sat, 27 Feb 2021 15:10:09 +0000 (+0000) Subject: hand: Require mut reference to gpx and xdata X-Git-Tag: otter-0.4.0~311 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=f163073c719249bdc15b69f0df757c026590ee6e;p=otter.git hand: Require mut reference to gpx and xdata Signed-off-by: Ian Jackson --- diff --git a/src/hand.rs b/src/hand.rs index 1fd5f873..41f56eca 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -24,6 +24,12 @@ struct HandState { owner: Option, } +impl HandState { + fn player(&self) -> Option { + self.owner.as_ref().map(|o| o.player) + } +} + #[typetag::serde(name="Hand")] impl PieceXData for HandState { } @@ -134,10 +140,12 @@ impl PieceTrait for Hand { let gplayers = &mut gs.players; let gpieces = &mut gs.pieces; let _goccults = &mut gs.occults; + let gpc = gpieces.byid_mut(piece)?; let xdata = gpc.xdata.get_mut::() .map_err(|e| APOE::ReportViaResponse(e.into()))?; let old_desc = self.describe_html_inner(Some(xdata)); + let old_player = xdata.player(); let dasharray = player_dasharray(gplayers, player); let gpl = gplayers.byid_mut(player)?; @@ -172,6 +180,12 @@ impl PieceTrait for Hand { let log = vec![ LogEntry { html: Html(format!("{} {}", nick.0, did)) }]; + // We need to reaquire mut references because create_occultation etc. + // need mut access to gpieces. + let gpc = gpieces.byid_mut(piece).expect("piece disappeared"); + let xdata = gpc.xdata.get_mut::().expect("xdata disappeared!"); + assert_eq!(xdata.player(), old_player); + xdata.owner = new_owner; Ok(PieceUpdate {