chiark / gitweb /
error handling
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 15:07:57 +0000 (16:07 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Jul 2020 15:07:57 +0000 (16:07 +0100)
src/api.rs
src/error.rs
src/gamestate.rs
src/pieces.rs

index 4bdc001cdfaed54378dd886ebc754f3633cf40a0..282f33e47176cbfbd06a4d3871c1fc386fbd2f2d 100644 (file)
@@ -81,6 +81,7 @@ fn api_piece_op<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
   })() {
     Err(err) => {
       let err : GameError = err;
+      if let GameError::InternalErrorSVG(svg) = err { Err(svg)? }
       eprintln!("API {:?} => {:?}", &form, &err);
     },
     Ok((update, logents)) => {
@@ -157,7 +158,7 @@ impl ApiPieceOp for ApiPieceGrab {
     let logent = LogEntry {
       html : format!("{} grasped {}",
                      &htmlescape::encode_minimal(&pl.nick),
-                     pc.describe_html(&lens.log_pri(piece, pc))),
+                     pc.describe_html(&lens.log_pri(piece, pc))?),
     };
 
     (update, vec![logent])
@@ -189,7 +190,7 @@ impl ApiPieceOp for ApiPieceUngrab {
     let logent = LogEntry {
       html : format!("{} released {}",
                      &htmlescape::encode_minimal(&pl.nick),
-                     pc.describe_html(&lens.log_pri(piece, pc))),
+                     pc.describe_html(&lens.log_pri(piece, pc))?),
     };
 
     (update, vec![logent])
index 06280505245d0a885e8ad9f7dea25c2522b3c016..0f048895f5217bc373fed3de65e774bcb4016f88 100644 (file)
@@ -9,6 +9,7 @@ pub enum GameError {
   Conflict,
   PieceGone,
   PieceHeld,
+  InternalErrorSVG(#[from] SVGProcessingError),
 }
 
 #[derive(Error,Debug)]
index a1c39e6e01065c1aa5e5c2d49d13741e61ee5a50..40294eb93198b36d0507f2f044d212e2f2a89612 100644 (file)
@@ -69,12 +69,16 @@ type SR = Result<(),SE>;
 
 pub trait Piece : Send + Debug {
   fn svg_piece(&self, f: &mut String, pri: &PieceRenderInstructions) -> SR;
+  #[throws(SE)]
   fn outline_path(&self, pri : &PieceRenderInstructions) -> String;
+  #[throws(SE)]
   fn surround_path(&self, pri : &PieceRenderInstructions) -> String;
   fn svg_x_defs(&self, pri : &PieceRenderInstructions) -> String;
+  #[throws(SE)]
   fn thresh_dragraise(&self, pri : &PieceRenderInstructions)
                       -> Option<Coord>;
-  fn describe_html(&self, face : Option<FaceId>) -> String;
+
+  fn describe_html(&self, face : Option<FaceId>) -> Result<String,SE>;
 }
 
 #[derive(Debug,Copy,Clone)]
@@ -126,8 +130,8 @@ impl PieceState {
   pub fn make_defs(&self, pri : &PieceRenderInstructions) -> String {
     let pr = self;
     let mut defs = String::new();
-    let dragraise = match pr.p.thresh_dragraise(pri) {
-      Some(n) if n < 0 => panic!(),
+    let dragraise = match pr.p.thresh_dragraise(pri)? {
+      Some(n) if n < 0 => Err(SE::NegativeDragraise)?,
       Some(n) => n,
       None => -1,
     };
@@ -138,7 +142,7 @@ impl PieceState {
     write!(defs, r##"</g>"##)?;
     write!(defs,
            r##"<path id="select{}" stroke="black" fill="none" d="{}"/>"##,
-           pri.id, pr.p.surround_path(&pri))?;
+           pri.id, pr.p.surround_path(&pri)?)?;
     write!(defs, "{}", pr.p.svg_x_defs(&pri))?;
     defs
   }
@@ -155,7 +159,7 @@ impl PieceState {
     }
   }
 
-  pub fn describe_html(&self, pri : &PieceRenderInstructions) -> String {
+  pub fn describe_html(&self, pri : &PieceRenderInstructions) -> Result<String,SE> {
     self.p.describe_html(Some(pri.face))
   }
 }
index 339c9560ba9d922b6ee05bd958bd73610fcb147b..a595b56762b1b6e45ba6fec49484e293ae7536ed 100644 (file)
@@ -24,6 +24,7 @@ pub enum SVGProcessingError {
   UnknownOperator,
   BadNumber,
   WriteFail,
+  NegativeDragraise,
 }
 
 display_as_debug!{SVGProcessingError}
@@ -87,12 +88,15 @@ impl Piece for SimpleShape {
     write!(f, r##"<path fill="{}" d="{}"/>"##,
            self.colours[pri.face], self.path)?;
   }
+  #[throws(SE)]
   fn outline_path(&self, _pri : &PieceRenderInstructions) -> String {
     self.path.clone()
   }
+  #[throws(SE)]
   fn surround_path(&self, _pri : &PieceRenderInstructions) -> String {
     self.scaled_path.clone()
   }
+  #[throws(SE)]
   fn thresh_dragraise(&self, _pri : &PieceRenderInstructions)
                       -> Option<Coord> {
     Some(self.approx_dia / 2)
@@ -100,6 +104,7 @@ impl Piece for SimpleShape {
   fn svg_x_defs(&self, _pri : &PieceRenderInstructions) -> String {
     "".to_owned()
   }
+  #[throws(SE)]
   fn describe_html(&self, face : Option<FaceId>) -> String {
     if let Some(face) = face {
       format!("a {} {}", self.colours[face], self.desc)