From: Ian Jackson Date: Sat, 13 Feb 2021 21:49:51 +0000 (+0000) Subject: Provide xdata affordances X-Git-Tag: otter-0.4.0~508 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9858f7cf7828df6b9f3e6cc3a8b8142d9cf96776;p=otter.git Provide xdata affordances Signed-off-by: Ian Jackson --- diff --git a/src/gamestate.rs b/src/gamestate.rs index a50315e1..8316bcc3 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -82,9 +82,11 @@ pub struct PieceState { pub gen: Generation, pub lastclient: ClientId, pub gen_before_lastclient: Generation, - pub xdata: Option>, + pub xdata: PieceXDataState, } +pub type PieceXDataState = Option>; + #[derive(Debug,Serialize,Deserialize)] pub struct LogEntry { pub html: Html, @@ -273,9 +275,18 @@ impl PieceState { #[throws(IE)] pub fn xdata(&mut self) -> &mut T { - let m = format!("piece xdata unexpectedly {:?}", &self.xdata); - let xdata = self.xdata - .get_or_insert_with(|| ::default()); + self.xdata.get_mut()? + } +} + +pub trait PieceXDataExt { + fn get_mut(&mut self) -> Result<&mut T, IE>; +} +impl PieceXDataExt for PieceXDataState { + #[throws(IE)] + fn get_mut(&mut self) -> &mut T { + let m = format!("piece xdata unexpectedly {:?}", &self); + let xdata = self.get_or_insert_with(|| ::default()); Any::downcast_mut(xdata).ok_or_else(|| internal_logic_error(m))? } }