From: Ian Jackson Date: Fri, 26 Jun 2020 21:05:28 +0000 (+0100) Subject: serialise for VisiblePieceId X-Git-Tag: otter-0.2.0~1551 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=df0026510b4cde95774a34d0d32a7ef958f89afb;p=otter.git serialise for VisiblePieceId --- diff --git a/src/bin/server.rs b/src/bin/server.rs index 301fcb27..3c0df0f3 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -112,7 +112,7 @@ fn session(form : Json) -> Result { #[derive(Debug,Serialize,Deserialize)] struct ApiGrab { t : String, - p : String, + p : VisiblePieceId, } #[post("/_/api/grab", format="json", data="
")] diff --git a/src/gamestate.rs b/src/gamestate.rs index 87fd743d..65e7e4a7 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -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(self, s : &str) -> Result + 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) -> Result>::Error> + where D: serde::de::Deserializer<'de> { + d.deserialize_str(VisiblePieceIdVisitor{}) + } +} + +impl Serialize for VisiblePieceId { + fn serialize(&self, s : S) -> Result + 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) }