From 6d25fc9dbbeb97d560b53bae0e2787eb0219e06b Mon Sep 17 00:00:00 2001 From: Joe Wilm Date: Thu, 28 Jan 2016 08:38:07 -0800 Subject: [PATCH] feat(de): Support struct key hinting Formats that do not provide type hints in the serialized format (bincode, redis) rely on hinting in the deserializer. Struct key hinting was not previously supported. This was not an issue in the past because bincode serializes structs as a keyless sequence of values. However, redis data is stored (key, value, key, value, ...), and the keys must be deserialized to properly create a struct. The default implementation of `visit_struct_key` is simply `visit` since that was the previous method called in codegen. --- serde/src/de/mod.rs | 10 ++++++++++ serde_codegen/src/de.rs | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index 75c3f4b0..637bab6d 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -403,6 +403,16 @@ pub trait Deserializer { self.visit_seq(visitor) } + /// This method hints that the `Deserialize` type is expecting some sort of struct key mapping. + /// This allows deserializers to choose between &str, usize, or &[u8] to properly deserialize a + /// struct key. + #[inline] + fn visit_struct_key(&mut self, visitor: V) -> Result + where V: Visitor, + { + self.visit(visitor) + } + /// Specify a format string for the deserializer. /// /// The deserializer format is used to determine which format diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 6980507b..a327993c 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -917,7 +917,7 @@ fn deserialize_field_visitor( } } - deserializer.visit(__FieldVisitor::{ phantom: PhantomData }) + deserializer.visit_struct_key(__FieldVisitor::{ phantom: PhantomData }) } } ).unwrap();