chiark / gitweb /
redo ungrab as api
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 17:15:43 +0000 (18:15 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 17:15:43 +0000 (18:15 +0100)
src/bin/server.rs

index be3d98ca4907e8970621adf77bd8f9f8e7d9bb97..144c39e496481383cd98ca005e9a513bcbc15b7e 100644 (file)
@@ -266,16 +266,37 @@ impl ApiPieceOp for ApiPieceGrab {
     (update, vec![logent])
   }
 }
+
 #[derive(Debug,Serialize,Deserialize)]
-struct ApiUngrab {
-  t : String,
-  p : VisiblePieceId,
+struct ApiPieceUngrab {
 }
 #[post("/_/api/ungrab", format="json", data="<form>")]
 #[throws(OE)]
-fn api_ungrab(form : Json<ApiUngrab>) -> impl response::Responder<'static> {
-  eprintln!("API {:?}", &form);
-  ""
+fn api_ungrab(form : Json<ApiPiece<ApiPieceUngrab>>)
+              -> impl response::Responder<'static> {
+  api_piece_op(form)
+}
+impl ApiPieceOp for ApiPieceUngrab {
+  #[throws(GameError)]
+  fn op(&self, gs: &mut GameState, player: PlayerId, piece: PieceId,
+        lens: &dyn Lens)
+        -> (PieceUpdateOp<()>, Vec<LogEntry>) {
+    let pl = gs.players.byid(player).unwrap();
+    let pc = gs.pieces.byid_mut(piece).unwrap();
+
+    if pc.held != Some(player) { Err(GameError::PieceHeld)? }
+    pc.held = None;
+    
+    let update = PieceUpdateOp::Modify(());
+
+    let logent = LogEntry {
+      html : format!("{} released {}",
+                     &htmlescape::encode_minimal(&pl.nick),
+                     pc.describe_html(&lens.log_pri(piece, pc))),
+    };
+
+    (update, vec![logent])
+  }
 }
 
 #[derive(Debug,Serialize,Deserialize)]