chiark / gitweb /
make piece held check overrideable
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 2 Oct 2020 22:11:18 +0000 (23:11 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 2 Oct 2020 22:11:18 +0000 (23:11 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/api.rs

index 2e43a3b01dae9c345b8f81675c15114fbc702a29..34829bc88fbcb0f995333ec1cbc5291e453ced10 100644 (file)
@@ -21,6 +21,13 @@ trait ApiPieceOp : Debug {
         p: &dyn Piece,
         lens: &dyn Lens /* used for LogEntry and PieceId but not Pos */)
         -> PieceUpdateFromOp;
+
+  #[throws(OnlineError)]
+  fn check_held(&self, pc: &PieceState, player: PlayerId) {
+    if pc.held != None && pc.held != Some(player) {
+      throw!(OnlineError::PieceHeld)
+    }
+  }
 }
 
 #[derive(Error,Debug)]
@@ -119,9 +126,7 @@ fn api_piece_op<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
       else { pc.gen };
 
     if u_gen > q_gen { throw!(PieceOpError::Conflict) }
-    if pc.held != None && pc.held != Some(player) {
-      throw!(OnlineError::PieceHeld)
-    };
+    form.op.check_held(pc,player)?;
     let (wrc, update, logents) = form.op.op(gs,player,piece,p.as_ref(),&lens)?;
     Ok::<_,ApiPieceOpError>((wrc, update, logents))
   })() {