chiark / gitweb /
serialise for VisiblePieceId
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 26 Jun 2020 21:05:28 +0000 (22:05 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 26 Jun 2020 21:05:28 +0000 (22:05 +0100)
src/bin/server.rs
src/gamestate.rs

index 301fcb277370a438c6acf6cb240e984614a73bb2..3c0df0f3a8974a08be164c559d843cf5dc0f9903 100644 (file)
@@ -112,7 +112,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,RE> {
 #[derive(Debug,Serialize,Deserialize)]
 struct ApiGrab {
   t : String,
-  p : String,
+  p : VisiblePieceId,
 }
 
 #[post("/_/api/grab", format="json", data="<form>")]
index 87fd743d92a7506cd085cf28c1caddf424a7c13a..65e7e4a70503cb61a4bc81c4064f15c71bce7b84 100644 (file)
@@ -26,6 +26,38 @@ impl Debug for VisiblePieceId {
   }
 }
 
+struct VisiblePieceIdVisitor { }
+impl<'de> serde::de::Visitor<'de> for VisiblePieceIdVisitor {
+  type Value = VisiblePieceId;
+  fn expecting(&self, f : &mut fmt::Formatter) -> fmt::Result {
+    write!(f,"(visible) piece id")
+  }
+  fn visit_str<DE>(self, s : &str) -> Result<VisiblePieceId, DE>
+    where DE: serde::de::Error,
+  {
+    let e = || DE::custom("could not deserialise visibile piece id");
+    let mut i = s.splitn(2,'.').map(|s| s.parse().map_err(|_| e()));
+    let h : u32 = i.next().ok_or_else(e)??;
+    let l : u32 = i.next().ok_or_else(e)??;
+    Ok(VisiblePieceId(((h as u64) << 32) | (l as u64)))
+  }
+}
+
+impl<'de> Deserialize<'de> for VisiblePieceId {
+  fn deserialize<D>(d: D) -> Result<Self, <D as serde::de::Deserializer<'de>>::Error>
+  where D: serde::de::Deserializer<'de> {
+    d.deserialize_str(VisiblePieceIdVisitor{})
+  }
+}
+
+impl Serialize for VisiblePieceId {
+  fn serialize<S>(&self, s : S) -> Result<S::Ok, S::Error>
+  where S : Serializer
+  {
+    s.serialize_str(&format!("{}", self))
+  }
+}
+
 impl PieceRenderInstructions {
   pub fn id_piece(&self) -> String { format!("piece{}", self.id) }
   pub fn id_select(&self) -> String { format!("select{}", self.id) }