From: Ian Jackson Date: Sat, 13 Feb 2021 22:07:17 +0000 (+0000) Subject: provide immutable xdata affordances X-Git-Tag: otter-0.4.0~503 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=429f843a65d64e2e07ca70505a0c5a6ef009c261;p=otter.git provide immutable xdata affordances Signed-off-by: Ian Jackson --- diff --git a/src/gamestate.rs b/src/gamestate.rs index a82b18a8..d6acb687 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -275,15 +275,28 @@ impl PieceState { } #[throws(IE)] - pub fn xdata(&mut self) -> &mut T { + pub fn xdata(&self) -> Option<&T> { + self.xdata.get()? + } + + #[throws(IE)] + pub fn xdata_mut(&mut self) -> &mut T { self.xdata.get_mut()? } } pub trait PieceXDataExt { + fn get(&self) -> Result, IE>; fn get_mut(&mut self) -> Result<&mut T, IE>; } impl PieceXDataExt for PieceXDataState { + #[throws(IE)] + fn get(&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(&mut self) -> &mut T { let m = format!("piece xdata unexpectedly {:?}", &self);