fn execute(cmd: MgmtCommand) -> MgmtResponse {
match cmd {
Noop { } => Fine { },
+ AddPiece(_) => Fine {
+ }, // xxx
}
}
#[derive(Debug,Serialize,Deserialize)]
pub enum MgmtCommand {
- Noop { }
+ Noop { },
+ AddPiece(Box<dyn PieceSpec>),
}
#[derive(Debug,Serialize,Deserialize)]
pub face : FaceId,
}
-#[typetag::deserialize(tag="type")]
-pub trait PieceSpec {
+#[typetag::serde(tag="type")]
+pub trait PieceSpec : Debug {
fn load(self) -> Result<Box<dyn Piece>,SE>;
}
}
}
-#[derive(Deserialize)]
+#[derive(Serialize,Deserialize)]
#[derive(Debug,Default)]
#[repr(transparent)]
struct ColourSpec(String);
}
}
-#[derive(Debug,Deserialize)]
+#[derive(Debug,Serialize,Deserialize)]
struct Disc {
diam : Coord,
faces : Vec<ColourSpec>,
}
-#[derive(Debug,Deserialize)]
+#[derive(Debug,Serialize,Deserialize)]
struct Square {
size : Vec<Coord>,
faces : Vec<ColourSpec>,
}
-#[typetag::deserialize]
+#[typetag::serde]
impl PieceSpec for Disc {
#[throws(SE)]
fn load(self) -> Box<dyn Piece> {
}
}
-#[typetag::deserialize]
+#[typetag::serde]
impl PieceSpec for Square {
#[throws(SE)]
fn load(self) -> Box<dyn Piece> {
use crate::imports::*;
-#[derive(Deserialize)]
+#[derive(Debug,Deserialize)]
struct GameSpec {
table : Pos,
players : Vec<PlayerSpec>,
pieces : Vec<PiecesSpec>,
}
-#[derive(Deserialize)]
+#[derive(Debug,Deserialize)]
struct PlayerSpec {
nick: String,
#[serde(flatten)]
access: Box<dyn PlayerAccessSpec>,
}
-#[derive(Deserialize)]
+#[derive(Debug,Deserialize)]
struct PiecesSpec {
pos : Option<Pos>,
count : Option<u32>,
}
#[typetag::deserialize(tag="access")]
-trait PlayerAccessSpec {
+trait PlayerAccessSpec : Debug {
#[throws(OE)]
fn make_token(&self) -> RawToken { RawToken::new_random()? }
fn deliver_token(&mut self) -> Result<(),OE>;