From: Ian Jackson Date: Sat, 4 Jul 2020 01:33:48 +0000 (+0100) Subject: errors X-Git-Tag: otter-0.2.0~1486 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=c0f5404066f268a0ce3bb7c9177ccaaa77fcf126;p=otter.git errors --- diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 00000000..aa90de14 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,22 @@ + +use crate::imports::*; + +use std::sync::PoisonError; + +#[derive(Error,Debug)] +pub enum OnlineError { + #[error("Game corrupted by previous crash - consult administrator")] + GameCorrupted, + #[error("client session not recognised (terminated by server?)")] + NoClientSession, + #[error("player not part of game (removed?)")] + NoPlayer, +} + +pub use OnlineError::{NoClientSession,NoPlayer}; + +use OnlineError::*; + +impl From> for OnlineError { + fn from(_: PoisonError) -> OnlineError { GameCorrupted } +} diff --git a/src/imports.rs b/src/imports.rs index 625df08f..55a93c71 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -45,12 +45,14 @@ pub use crate::pieces::*; pub use crate::keydata::*; pub use crate::updates::*; pub use crate::sse; +pub use crate::error::*; pub type E = anyhow::Error; pub type AE = anyhow::Error; +pub type OE = OnlineError; + pub type SvgData = Vec; pub type Coord = isize; pub type Pos = [Coord; 2]; pub type Colour = String; - diff --git a/src/lib.rs b/src/lib.rs index f8bd1e1a..1a8627df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,3 +6,4 @@ pub mod gamestate; pub mod keydata; pub mod updates; pub mod sse; +pub mod error; diff --git a/src/sse.rs b/src/sse.rs index 91e827f6..0a6ae522 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -169,19 +169,19 @@ struct APIForm { } */ -#[throws(E)] +#[throws(OE)] pub fn content(iad : InstanceAccessDetails, gen: Generation) -> impl Read { let client = iad.ident; let content = { - let mut ig = iad.g.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; + let mut ig = iad.g.lock()?; let _g = &mut ig.gs; - let cl = ig.clients.get(client).ok_or_else(|| anyhow!("no client"))?; + let cl = ig.clients.get(client).ok_or(NoClientSession)?; let player = cl.player; let ami = iad.g.clone(); - let log = &ig.updates.get(player).ok_or_else(|| anyhow!("no plaeyr"))?.log; + let log = &ig.updates.get(player).ok_or(NoPlayer)?.log; let to_send = match log.into_iter().rev() .find(|(_,update)| update.gen < gen) {