let pri_for_all = lens.svg_pri(piece,pc,Default::default());
- let update = update.map_new_state(|_|{
- let mut ns = pc.prep_piecestate(&pri_for_all);
+ let update = update.try_map_new_state(|_|{
+ let mut ns = pc.prep_piecestate(&pri_for_all)?;
lens.massage_prep_piecestate(&mut ns);
- ns
- });
+ <Result<_,SVGProcessingError>>::Ok(ns)
+ })?;
let mut us = Vec::with_capacity(1 + logents.len());
InvalidZCoord,
#[error("JSON~ serialisation error: {0:?}")]
JSONSerializeFailed(#[from] serde_json::error::Error),
+ #[error("SVG processing/generation error {0:?}")]
+ SVGProcessingFailed(#[from] SVGProcessingError),
}
pub use OnlineError::{NoClient,NoPlayer};
// ---------- game state - rendering etc. ----------
impl PieceState {
+ #[throws(SE)]
pub fn make_defs(&self, pri : &PieceRenderInstructions) -> String {
let pr = self;
let mut defs = String::new();
defs
}
+ #[throws(SE)]
pub fn prep_piecestate(&self, pri : &PieceRenderInstructions)
-> PreparedPieceState {
PreparedPieceState {
pos : self.pos,
held : self.held,
- svg : self.make_defs(pri),
+ svg : self.make_defs(pri)?,
z : self.zlevel.z,
zg : self.zlevel.zg,
}
use rocket::http::Status;
use OnlineError::*;
let status = match self {
- GameCorrupted | JSONSerializeFailed(_)
+ GameCorrupted | JSONSerializeFailed(_) | SVGProcessingFailed(_)
=> Status::InternalServerError,
NoClient | NoPlayer => Status::NotFound,
InvalidZCoord => Status::BadRequest,
pub use std::collections::VecDeque;
pub use std::num::Wrapping;
pub use std::cmp;
+pub use std::error::Error;
pub use thiserror::Error;
pub use anyhow::{Context,anyhow};
id : make_pieceid_visible(gpid),
face : pr.face,
};
- let defs = pr.make_defs(&pri);
+ let defs = pr.make_defs(&pri)?;
alldefs.push((pri.id, defs));
let for_info = SessionPieceLoadJson {
SetZLevel(_) => None,
}
}
- pub fn map_new_state<NS2,F: FnOnce(NS) -> NS2>(self, f:F)
- -> PieceUpdateOp<NS2> {
+ pub fn try_map_new_state<NS2,E:Error, F: FnOnce(NS) -> Result<NS2,E>>
+ (self, f:F) -> Result<PieceUpdateOp<NS2>,E>
+ {
use PieceUpdateOp::*;
- match self {
+ Ok(match self {
Delete() => Delete(),
- Insert(ns) => Insert(f(ns)),
- Modify(ns) => Modify(f(ns)),
+ Insert(ns) => Insert(f(ns)?),
+ Modify(ns) => Modify(f(ns)?),
Move(pos) => Move(pos),
SetZLevel(zl) => SetZLevel(zl),
- }
+ })
+ }
+ pub fn map_new_state<NS2,F: FnOnce(NS) -> NS2>(self, f:F)
+ -> PieceUpdateOp<NS2> {
+ #[derive(Error,Debug)]
+ enum Never { }
+ self.try_map_new_state(|ns| <Result<_,Never>>::Ok(f(ns))).unwrap()
}
pub fn new_z_generation(&self) -> Option<Generation> {
use PieceUpdateOp::*;