ServerFailure(_) => Status::InternalServerError,
NoClient | NoPlayer(_) | GameBeingDestroyed
=> Status::NotFound,
- OE::PieceHeld | OE::PieceGone |
+ OE::PieceHeld |
OE::OverlappingOccultation | OE::Occultation |
OE::BadPieceStateForOperation
=> Status::Conflict,
let iplayers = &g.iplayers;
let _ = iplayers.byid(player)?;
let gpl = gs.players.byid(player)?;
- let piece = vpiece_decode(gs, player, gpl, form.piece)
- .ok_or(OE::PieceGone)?;
+ let piece = vpiece_decode(gs, player, gpl, form.piece);
+ let piece = if let Some(piece) = piece { piece } else { return Ok(()) };
let was_held = gs.pieces.get(piece).as_ref().map(|gpc| gpc.held);
use ApiPieceOpError::*;
match (||{
- let ipc = ipieces.get(piece).ok_or(OnlineError::PieceGone)?;
+ let ipc = ipieces.get(piece).ok_or(POE::PieceGone)?;
let gpc = gs.pieces.byid_mut(piece)?;
let q_gen = form.gen;
let gpl = players.byid_mut(player)?;
let pri = piece_pri(ioccults, &gs.occults, player, gpl, piece, gpc, ipc)
- .ok_or(OE::PieceGone)?;
+ .ok_or(POE::PieceGone)?;
let pcs = pri.describe(ioccults, gpc, ipc).0;
ioccults,gpl,gpc,ipc,
"released"
)?;
- let who_by = who_by.ok_or(OE::PieceGone)?;
+ let who_by = who_by.ok_or(POE::PieceGone)?;
if gpc.held != Some(player) { throw!(OnlineError::PieceHeld) }
gpc.held = None;
player, gs.players.byid_mut(player)?,
piece, gs.pieces.byid(piece)?,
ipc)
- .ok_or(OE::PieceGone)?;
+ .ok_or(POE::PieceGone)?;
let y = {
use PriOG::*;
match pri.occulted {
#[error("JSON deserialisation error: {0:?}")]
BadJSON(serde_json::Error),
#[error("referenced piece is gone (maybe race)")]
- PieceGone, // xxx this needs to go away and be done via updates stream
- #[error("improper piece hold status for op (maybe race)")]
PieceHeld,
#[error("improper UI operation")]
BadOperation,
pub enum PieceOpError {
Conflict,
PosOffTable,
+ PieceGone,
}
display_as_debug!{PieceOpError}
}
impl IdForById for PieceId {
- type Error = OE;
- const ERROR: OE = OE::PieceGone;
+ type Error = POE;
+ const ERROR: POE = POE::PieceGone;
}
#[macro_export]
impl ById for GPieces {
type Id = PieceId;
type Entry = GPiece;
- type Error = OnlineError;
- #[throws(OE)]
+ type Error = PieceOpError;
+ #[throws(POE)]
fn byid(&self, piece: PieceId) -> &GPiece {
- self.get(piece).ok_or(OE::PieceGone)?
+ self.get(piece).ok_or(POE::PieceGone)?
}
- #[throws(OE)]
+ #[throws(POE)]
fn byid_mut(&mut self, piece: PieceId) -> &mut GPiece {
- self.get_mut(piece).ok_or(OE::PieceGone)?
+ self.get_mut(piece).ok_or(POE::PieceGone)?
}
}
views: OccultationViews,
) -> Vec<(PieceId, PieceUpdateOps)> {
{
- let ogpc = gpieces.byid(occulter)?;
+ let ogpc = gpieces.get(occulter).ok_or_else(
+ ||internal_logic_error("create occultation with non-piece"))?;
if ogpc.occult.active.is_some() {
throw!(internal_logic_error("re-occulting!"))
}