chiark / gitweb /
hand: Require mut reference to gpx and xdata
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 27 Feb 2021 15:10:09 +0000 (15:10 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 27 Feb 2021 15:35:18 +0000 (15:35 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/hand.rs

index 1fd5f8736eb3801736b785588dc6b9eaf30dc49c..41f56eca1261bb367b4e303ac24bd98bc3c2c6b1 100644 (file)
@@ -24,6 +24,12 @@ struct HandState {
   owner: Option<MagicOwner>,
 }
 
+impl HandState {
+  fn player(&self) -> Option<PlayerId> {
+    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::<HandState>()
       .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::<HandState>().expect("xdata disappeared!");
+    assert_eq!(xdata.player(), old_player);
+
     xdata.owner = new_owner;
 
     Ok(PieceUpdate {