chiark / gitweb /
wip error handling
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 14:49:46 +0000 (15:49 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 14:49:46 +0000 (15:49 +0100)
src/api.rs
src/error.rs
src/gamestate.rs
src/http.rs
src/imports.rs
src/session.rs
src/updates.rs

index 641ac026cd37a1aff4a788d8df1d978c42723d7d..4bdc001cdfaed54378dd886ebc754f3633cf40a0 100644 (file)
@@ -97,11 +97,11 @@ fn api_piece_op<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
 
       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());
 
index 7d4431937a4a64ac67504d858caee478b1e7b4b5..06280505245d0a885e8ad9f7dea25c2522b3c016 100644 (file)
@@ -23,6 +23,8 @@ pub enum OnlineError {
   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};
index de88436f0fa5769b84427ecabcfbda4d01f4c769..df151cccb05719e49d4b184d54777b943eb3f90c 100644 (file)
@@ -132,6 +132,7 @@ impl Display for ZCoord {
 // ---------- game state - rendering etc. ----------
 
 impl PieceState {
+  #[throws(SE)]
   pub fn make_defs(&self, pri : &PieceRenderInstructions) -> String {
     let pr = self;
     let mut defs = String::new();
@@ -152,12 +153,13 @@ impl PieceState {
     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,
     }
index 9751e372c19c0fb01899291e0353fb2f8c994e3f..973b15163ecaedb46b78297e35e351324ecbeb62 100644 (file)
@@ -14,7 +14,7 @@ impl<'r> Responder<'r> for OnlineError {
     use rocket::http::Status;
     use OnlineError::*;
     let status = match self {
-      GameCorrupted | JSONSerializeFailed(_)
+      GameCorrupted | JSONSerializeFailed(_) | SVGProcessingFailed(_)
         => Status::InternalServerError,
       NoClient | NoPlayer => Status::NotFound,
       InvalidZCoord => Status::BadRequest,
index 77ac81088b47b790b5c21f127d8d84ace6dbe9da..35906b4c923356e721aaee327a7eb3ced7a3a205 100644 (file)
@@ -17,6 +17,7 @@ pub use std::iter::repeat_with;
 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};
index fa13f7ac7b23ba20f8c36e02ae4984f54239ff7f..8c3a329ed96769fecd2280ee9773b9949c8ba335 100644 (file)
@@ -91,7 +91,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,OE> {
         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 {
index 6baabec5bea432e6783cfc76f8717f10c205eace..4ae1dc99db47b2aea53e34802562564220c13d32 100644 (file)
@@ -122,16 +122,23 @@ impl<NS> PieceUpdateOp<NS> {
       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::*;