diff --git a/card_game/src/lib.rs b/card_game/src/lib.rs index 0dd30bb..6239339 100644 --- a/card_game/src/lib.rs +++ b/card_game/src/lib.rs @@ -476,7 +476,6 @@ impl Default for SessionConfig { G: serde::Serialize + for <'a> serde::Deserialize<'a>, G::Stats: serde::Serialize + for <'a> serde::Deserialize<'a>, G::Config: serde::Serialize + for <'a> serde::Deserialize<'a>, - Vec>: serde::Serialize + for <'a> serde::Deserialize<'a>, ") )] pub struct Session { @@ -502,14 +501,6 @@ impl StateSnapshot { } } #[derive(Clone, Debug)] -#[cfg_attr( - feature = "serde", - derive(serde_derive::Deserialize, serde_derive::Serialize), - serde(bound = " - G: serde::Serialize + for <'a> serde::Deserialize<'a>, - Vec>: serde::Serialize + for <'a> serde::Deserialize<'a>, - ") -)] pub struct SessionState { state: G, history: Vec>, @@ -670,3 +661,48 @@ where self.state.is_win() } } + +#[cfg(feature = "serde")] +impl<'de, G: Game> serde::Deserialize<'de> for SessionState +where + G: serde::Serialize + for<'a> serde::Deserialize<'a>, +{ + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct SessionStateVisitor(core::marker::PhantomData); + impl<'de, G: Game> serde::de::Visitor<'de> for SessionStateVisitor { + type Value = SessionState; + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "State History") + } + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + let mut stack = Stack::new(); + while let Some(card) = seq.next_element()? { + // TODO: Error + stack.try_push(card).unwrap(); + } + Ok(stack) + } + } + deserializer.deserialize_seq(SessionStateVisitor(core::marker::PhantomData)) + } +} +#[cfg(feature = "serde")] +impl serde::Serialize for SessionState { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeSeq; + let mut seq = serializer.serialize_seq(Some(self.len()))?; + for card in self.as_slice() { + seq.serialize_element(card)?; + } + seq.end() + } +}