pub struct PieceId;
}
-#[derive(Copy,Clone,Serialize,Deserialize)]
-#[serde(into="String")]
-#[serde(try_from="&str")]
-pub struct VisiblePieceId(pub slotmap::KeyData);
+visible_slotmap_key!{VisiblePieceId}
+display_consequential_impls!{VisiblePieceId}
pub fn make_pieceid_visible(p : PieceId) -> VisiblePieceId {
// xxx need to do censorship mapping here
pub type VisiblePieceIdSvgIds = &'static [&'static str];
-impl Display for VisiblePieceId {
- #[throws(fmt::Error)]
- fn fmt(&self, f : &mut fmt::Formatter) { slotkey_write(self.0,'.',f)? }
-}
-display_consequential_impls!{VisiblePieceId}
-
-impl TryFrom<&str> for VisiblePieceId {
- type Error = AE;
- #[throws(AE)]
- fn try_from(s : &str) -> VisiblePieceId {
- VisiblePieceId(slotkey_parse(s,'.')?)
- }
-}
-
impl PieceRenderInstructions {
pub fn id_piece(&self) -> String { format!("piece{}", self.id) }
pub fn id_select(&self) -> String { format!("select{}", self.id) }
}
}
}
-
pub use crate::display_consequential_impls; // this is madness!
#[throws(AE)]
let v = k.as_ffi();
write!(f, "{}{}{}", v >> 32, sep, v & 0xffffffff)?
}
+
+#[macro_export]
+macro_rules! visible_slotmap_key {
+ ( $x:ident ) => {
+ #[derive(Copy,Clone,Serialize,Deserialize)]
+ #[serde(into="String")]
+ #[serde(try_from="&str")]
+ pub struct $x(pub slotmap::KeyData);
+
+ impl Display for $x {
+ #[throws(fmt::Error)]
+ fn fmt(&self, f : &mut fmt::Formatter) { slotkey_write(self.0,'.',f)? }
+ }
+
+ impl TryFrom<&str> for VisiblePieceId {
+ type Error = AE;
+ #[throws(AE)]
+ fn try_from(s : &str) -> VisiblePieceId {
+ VisiblePieceId(slotkey_parse(s,'.')?)
+ }
+ }
+ }
+}
+pub use crate::visible_slotmap_key; // this is madness!