let initial_state = {
State { cooldown_expires: cooldown_start_value(cooldown_time)? }
};
- let _state: &mut State = gpc.xdata_mut(|| initial_state)?;
+ gpc.xdata_init(initial_state)?;
let occ_label = |occ: &OccultSpec| -> String {
if occ.label == "" && labels.iter().any(|l| l != "") {
self.xdata.get_mut_exp()?
}
+ #[throws(IE)]
+ pub fn xdata_init<T:PieceXData>(&mut self, val: T) -> &mut T {
+ self.xdata.init(val)?
+ }
+
pub fn moveable(&self) -> PieceMoveable {
if self.occult.is_active() { PieceMoveable::No }
else { self.moveable }
&got, T::dummy(),
))
}
+fn xdata_unexpectedly_present(got: &dyn PieceXData) -> InternalError {
+ internal_logic_error(format!(
+ "\n\
+ piece xdata unexpectedly present: {:?}\n",
+ &got,
+ ))
+}
fn xdata_missing<T:PieceXData>() -> InternalError {
internal_logic_error(format!(
"\n\
let xdata = self.as_mut().ok_or_else(|| xdata_missing::<T>())?;
xdata_get_mut_inner(xdata)?
}
+
+ #[throws(IE)]
+ fn init<T:PieceXData>(&mut self, val: T) -> &mut T {
+ if let Some(xdata) = self.as_ref() {
+ let xdata: &dyn PieceXData = &**xdata;
+ throw!(xdata_unexpectedly_present(xdata));
+ }
+ let xdata = self.insert(Box::new(val) as _);
+ xdata_get_mut_inner(xdata)?
+ }
}
fn xdata_get_mut_inner<