trait ApiPieceOp : Debug {
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp;
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate;
#[throws(OnlineError)]
fn check_held(&self, pc: &PieceState, player: PlayerId) {
if u_gen > q_gen { throw!(PieceOpError::Conflict) }
form.op.check_held(pc,player)?;
- let (wrc, update, logents) =
+ let update =
form.op.op(ApiPieceOpArgs {
gs, player, piece,
p: p.as_ref(),
lens: &lens,
})?;
- Ok::<_,ApiPieceOpError>((wrc, update, logents))
+ Ok::<_,ApiPieceOpError>(update)
})() {
Err(ReportViaUpdate(poe)) => {
PrepareUpdatesBuffer::piece_report_error(
warn!("api_piece_op ERROR {:?}: {:?}", &form, &err);
Err(err)?;
},
- Ok((wrc, update, logents)) => {
+ Ok(PieceUpdate { wrc, log, ops }) => {
let mut buf = PrepareUpdatesBuffer::new(g,
Some((wrc, client, form.cseq)),
- Some(1 + logents.len()));
+ Some(1 + log.len()));
- buf.piece_update(piece, update, &lens);
- buf.log_updates(logents);
+ buf.piece_update(piece, ops, &lens);
+ buf.log_updates(log);
debug!("api_piece_op OK: {:?}", &form);
}
struct ApiPieceGrab {
}
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
let gpl = gs.players.byid(player)?;
let pc = gs.pieces.byid_mut(piece)?;
let logents = log_did_to_piece(gpl, lens, piece, pc, p, "grasped");
(WhatResponseToClientOp::Predictable,
- update, logents)
+ update, logents).into()
}
}
fn check_held(&self, _pc: &PieceState, _player: PlayerId) { }
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
let gpl = gs.players.byid(player)?;
let pc = gs.pieces.byid_mut(piece)?;
})};
(WhatResponseToClientOp::Predictable,
- update, vec![logent])
+ update, vec![logent]).into()
}
}
struct ApiPieceUngrab {
}
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
let gpl = gs.players.byid(player).unwrap();
let pc = gs.pieces.byid_mut(piece).unwrap();
let logents = log_did_to_piece(gpl, lens, piece, pc, p, "released");
(WhatResponseToClientOp::Predictable,
- update, logents)
+ update, logents).into()
}
}
z : ZCoord,
}
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,piece, .. } = a;
let pc = gs.pieces.byid_mut(piece).unwrap();
pc.zlevel = ZLevel { z : self.z.clone(), zg : gs.gen };
let update = PieceUpdateOp::SetZLevel(());
(WhatResponseToClientOp::Predictable,
- update, vec![])
+ update, vec![]).into()
}
}
struct ApiPieceMove(Pos);
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,piece, .. } = a;
let pc = gs.pieces.byid_mut(piece).unwrap();
let (pos, clamped) = self.0.clamped(gs.table_size);
}
let update = PieceUpdateOp::Move(self.0);
(WhatResponseToClientOp::Predictable,
- update, logents)
+ update, logents).into()
}
}
struct ApiPieceRotate(CompassAngle);
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
let pc = gs.pieces.byid_mut(piece).unwrap();
let gpl = gs.players.byid(player).unwrap();
let logents = log_did_to_piece(gpl, lens, piece, pc, p, "rotated");
let update = PieceUpdateOp::Modify(());
(WhatResponseToClientOp::Predictable,
- update, logents)
+ update, logents).into()
}
}
struct ApiPiecePin (bool);
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
let pc = gs.pieces.byid_mut(piece).unwrap();
let gpl = gs.players.byid(player).unwrap();
if pc.pinned { "pinned" } else { "unpinned" },
);
(WhatResponseToClientOp::Predictable,
- update, logents)
+ update, logents).into()
}
}
wrc: WhatResponseToClientOp,
}
#[throws(ApiPieceOpError)]
- fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp {
+ fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate {
let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a;
'_normal_global_ops__not_loop: loop {
let pc = gs.pieces.byid_mut(piece)?;
wrc,
PieceUpdateOp::Modify(()),
log_did_to_piece(gpl, lens, piece, pc, p, "flipped"),
- )
+ ).into()
},
_ => break,
SetZLevel(ZL),
}
-pub type PieceUpdateFromOp = (WhatResponseToClientOp,
- PieceUpdateOp<(),()>, Vec<LogEntry>);
-pub type PieceUpdateResult = Result<PieceUpdateFromOp, ApiPieceOpError>;
+pub type PieceUpdateFromOpSimple = (
+ WhatResponseToClientOp,
+ PieceUpdateOp<(),()>,
+ Vec<LogEntry>,
+);
+pub type PieceUpdateResult = Result<PieceUpdate, ApiPieceOpError>;
+
+#[derive(Debug)]
+pub struct PieceUpdate {
+ pub wrc: WhatResponseToClientOp,
+ pub log: Vec<LogEntry>,
+ pub ops: PieceUpdateOps,
+}
+
+#[derive(Debug)]
+pub enum PieceUpdateOps {
+ Simple(PieceUpdateOp<(),()>),
+}
+
+impl From<PieceUpdateOp<(),()>> for PieceUpdateOps {
+ fn from(op: PieceUpdateOp<(),()>) -> Self { PUO::Simple(op) }
+}
+
+impl From<PieceUpdateFromOpSimple> for PieceUpdate {
+ fn from((wrc, op, log): PieceUpdateFromOpSimple) -> Self {
+ PieceUpdate { wrc, log, ops: op.into() }
+ }
+}
// ---------- for traansmission ----------
}
}
- pub fn piece_update(&mut self, piece: PieceId, update: PieceUpdateOp<(),()>,
+ pub fn piece_update(&mut self, piece: PieceId, ops: PieceUpdateOps,
lens: &dyn Lens) {
// Caller needs us to be infallible since it is too late by
// this point to back out a game state change.
+ let PUO::Simple(update) = ops;
+
let update = self.piece_update_fallible(
piece, update, lens,
|pc, gen, by_client|