chiark / gitweb /
provide immutable xdata affordances
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 13 Feb 2021 22:07:17 +0000 (22:07 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 14 Feb 2021 16:00:53 +0000 (16:00 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs

index a82b18a8ca90cd2c149f3671c25bde8e3a0b06c8..d6acb687272273caf2762d0c0a7dafe540a40327 100644 (file)
@@ -275,15 +275,28 @@ impl PieceState {
   }
 
   #[throws(IE)]
-  pub fn xdata<T:PieceXData+Default>(&mut self) -> &mut T {
+  pub fn xdata<T:PieceXData+Default>(&self) -> Option<&T> {
+    self.xdata.get()?
+  }
+
+  #[throws(IE)]
+  pub fn xdata_mut<T:PieceXData+Default>(&mut self) -> &mut T {
     self.xdata.get_mut()?
   }
 }
 
 pub trait PieceXDataExt {
+  fn get<T:PieceXData>(&self) -> Result<Option<&T>, IE>;
   fn get_mut<T:PieceXData+Default>(&mut self) -> Result<&mut T, IE>;
 }
 impl PieceXDataExt for PieceXDataState {
+  #[throws(IE)]
+  fn get<T:PieceXData>(&self) -> Option<&T> {
+    let m = format!("piece xdata unexpectedly {:?}", &self);
+    let xdata = match &self { Some(xdata) => xdata, None => return None };
+    Some(Any::downcast_ref(xdata).ok_or_else(|| internal_logic_error(m))?)
+  }
+
   #[throws(IE)]
   fn get_mut<T:PieceXData+Default>(&mut self) -> &mut T {
     let m = format!("piece xdata unexpectedly {:?}", &self);