use core::{ any, fmt::{self, Formatter}, }; use serde::{ de::{Error, Visitor}, Deserialize, Deserializer, Serialize, Serializer, }; use super::{name::Name, FrameCount}; impl Serialize for Name { fn serialize(&self, serializer: S) -> Result { serializer.serialize_str(self.as_str()) } } impl<'de> Deserialize<'de> for Name { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_str(EntityVisitor) } } struct EntityVisitor; impl<'de> Visitor<'de> for EntityVisitor { type Value = Name; fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { formatter.write_str(any::type_name::()) } fn visit_str(self, v: &str) -> Result { Ok(Name::new(v.to_string())) } fn visit_string(self, v: String) -> Result { Ok(Name::new(v)) } } // Manually implementing serialize/deserialize allows us to use a more compact representation as simple integers impl Serialize for FrameCount { fn serialize(&self, serializer: S) -> Result { serializer.serialize_u32(self.0) } } impl<'de> Deserialize<'de> for FrameCount { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_u32(FrameVisitor) } } struct FrameVisitor; impl<'de> Visitor<'de> for FrameVisitor { type Value = FrameCount; fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { formatter.write_str(any::type_name::()) } fn visit_u32(self, v: u32) -> Result where E: Error, { Ok(FrameCount(v)) } } #[cfg(test)] mod tests { use super::*; use serde_test::{assert_tokens, Token}; #[test] fn test_serde_name() { let name = Name::new("MyComponent"); assert_tokens(&name, &[Token::String("MyComponent")]); } #[test] fn test_serde_frame_count() { let frame_count = FrameCount(100); assert_tokens(&frame_count, &[Token::U32(100)]); } }