chiark / gitweb /
api: Allow a piece api op to return updates for other pieces
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 16 Feb 2021 20:35:18 +0000 (20:35 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 17 Feb 2021 00:30:16 +0000 (00:30 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/api.rs
src/updates.rs

index 2b8545e9e176cdda8cfb3bb3d2f675c4e0a3fdde..f06ccfc958b9d86c40172e31c144ff19da3d198c 100644 (file)
@@ -47,6 +47,12 @@ trait ApiPieceOp: Debug {
   #[throws(ApiPieceOpError)]
   fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate;
 
+  #[throws(ApiPieceOpError)]
+  fn op_complex(&self, a: ApiPieceOpArgs)
+                -> (PieceUpdate, Vec<(PieceId, PieceUpdateOps)>) {
+    (self.op(a)?, vec![])
+  }
+
   #[throws(OnlineError)]
   fn check_held(&self, pc: &PieceState, player: PlayerId) {
     if pc.held != None && pc.held != Some(player) {
@@ -121,7 +127,7 @@ fn api_piece_op<O: ApiPieceOp>(form: Json<ApiPiece<O>>)
     if u_gen > q_gen { throw!(PieceOpError::Conflict) }
     form.op.check_held(pc,player)?;
     let update =
-      form.op.op(ApiPieceOpArgs {
+      form.op.op_complex(ApiPieceOpArgs {
         gs, player, piece, ipieces,
         p: p.as_ref(),
       })?;
@@ -145,12 +151,13 @@ fn api_piece_op<O: ApiPieceOp>(form: Json<ApiPiece<O>>)
       warn!("api_piece_op ERROR {:?}: {:?}", &form, &err);
       Err(err)?;
     },
-    Ok(PieceUpdate { wrc, log, ops }) => {
+    Ok((PieceUpdate { wrc, log, ops }, updates)) => {
       let mut buf = PrepareUpdatesBuffer::new(g,
                                               Some((wrc, client, form.cseq)),
                                               Some(1 + log.len()));
       
       buf.piece_update(piece, ops);
+      buf.piece_updates(updates);
       buf.log_updates(log);
 
       debug!("api_piece_op OK: {:?}", &form);
index dbc434378bb52a98ae400a89c091f3c15adff1ee..43f54a29bfcab1fe58f75a1752b793aa3d664644 100644 (file)
@@ -589,6 +589,12 @@ impl<'r> PrepareUpdatesBuffer<'r> {
     self.us.push(update);
   }
 
+  pub fn piece_updates(&mut self, updates: Vec<(PieceId, PieceUpdateOps)>) {
+    for (piece, ops) in updates {
+      self.piece_update(piece, ops);
+    }
+  }
+
   pub fn raw_updates(&mut self, mut raw: Vec<PreparedUpdateEntry>) {
     self.us.append(&mut raw)
   }