#[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) {
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(),
})?;
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);
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)
}