From fadefe93c27f4c00b16a0b3c9b308180cea02ee2 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Sat, 30 May 2026 10:24:24 -0700 Subject: [PATCH] what is up with serde moving the deserializer --- card_game/src/lib.rs | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/card_game/src/lib.rs b/card_game/src/lib.rs index 6239339..0c2db52 100644 --- a/card_game/src/lib.rs +++ b/card_game/src/lib.rs @@ -665,13 +665,16 @@ where #[cfg(feature = "serde")] impl<'de, G: Game> serde::Deserialize<'de> for SessionState where - G: serde::Serialize + for<'a> serde::Deserialize<'a>, + G: serde::Deserialize<'de>, + G::Instruction: serde::Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { - struct SessionStateVisitor(core::marker::PhantomData); + struct SessionStateVisitor { + state: G, + } impl<'de, G: Game> serde::de::Visitor<'de> for SessionStateVisitor { type Value = SessionState; fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -681,27 +684,44 @@ where 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(); + let mut state = self.state.clone(); + let mut history = match seq.size_hint() { + Some(capacity) => Vec::with_capacity(capacity), + None => Vec::new(), + }; + while let Some(instruction) = seq.next_element()? { + history.push(StateSnapshot { + state: state.clone(), + instruction: instruction.clone(), + }); + state.process_instruction(stats, config, instruction); } - Ok(stack) + Ok(SessionState { state, history }) } } - deserializer.deserialize_seq(SessionStateVisitor(core::marker::PhantomData)) + let state = G::deserialize(deserializer)?; + deserializer.deserialize_seq(SessionStateVisitor { state }) } } #[cfg(feature = "serde")] -impl serde::Serialize for SessionState { +impl serde::Serialize for SessionState +where + G: serde::Serialize, + G::Instruction: serde::Serialize, +{ fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { + if let Some(state) = self.history.first() { + state.serialize(serializer)?; + }else{ + self.state.serialize(serializer)?; + } use serde::ser::SerializeSeq; - let mut seq = serializer.serialize_seq(Some(self.len()))?; - for card in self.as_slice() { - seq.serialize_element(card)?; + let mut seq = serializer.serialize_seq(Some(self.history.len()))?; + for snapshot in &self.history { + seq.serialize_element(&snapshot.instruction)?; } seq.end() }