From d39e74aca16e7a31d22739f235c002eb55d68fcb Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 21:48:41 +0500 Subject: [PATCH 1/8] Correctly forward deserialize_i128 / deserialize_u128 to the original deserializer in Compact / Readable wrappers For historical reasons Deserializer trait has default implementation for 128-bit integers which returns error, so it is important to not forgot to re-implement those methods. --- src/configure.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index d3ee52e..abfadfb 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -486,10 +486,12 @@ macro_rules! impl_deserializer { deserialize_u16, deserialize_u32, deserialize_u64, + deserialize_u128, deserialize_i8, deserialize_i16, deserialize_i32, deserialize_i64, + deserialize_i128, deserialize_f32, deserialize_f64, deserialize_char, From c758d360be74e1b0e2d43926638bbf5a6dc0935d Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 21:48:41 +0500 Subject: [PATCH 2/8] Correctly forward serialize_i128 / serialize_u128 to the original serializer in Compact / Readable wrappers For historical reasons Serializer trait has default implementation for 128-bit integers which returns error, so it is important to not forgot to re-implement those methods. --- src/configure.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index abfadfb..505ffb1 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -205,10 +205,12 @@ macro_rules! impl_serializer { serialize_i16 i16, serialize_i32 i32, serialize_i64 i64, + serialize_i128 i128, serialize_u8 u8, serialize_u16 u16, serialize_u32 u32, serialize_u64 u64, + serialize_u128 u128, serialize_f32 f32, serialize_f64 f64, serialize_char char, From 82f2796ac9233febfb89211ce2f4659718cf32a3 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 23:09:58 +0500 Subject: [PATCH 3/8] Correctly forward visit_i128 / visit_u128 to the original visitor in Compact / Readable wrappers --- src/configure.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index 505ffb1..f463d01 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -614,6 +614,12 @@ macro_rules! impl_deserializer { { self.0.visit_i64(v) } + fn visit_i128(self, v: i128) -> Result + where + E: Error, + { + self.0.visit_i128(v) + } fn visit_u8(self, v: u8) -> Result where E: Error, @@ -638,6 +644,12 @@ macro_rules! impl_deserializer { { self.0.visit_u64(v) } + fn visit_u128(self, v: u128) -> Result + where + E: Error, + { + self.0.visit_u128(v) + } fn visit_f32(self, v: f32) -> Result where E: Error, From 13200289fe1eefa98398f384448ba4fefa6e3e6e Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 22:52:15 +0500 Subject: [PATCH 4/8] Correctly wrap key in SerializeMap::serialize_entry Fixes #34 --- src/configure.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configure.rs b/src/configure.rs index f463d01..b70b739 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -413,7 +413,7 @@ macro_rules! impl_serializer { K: ?Sized + Serialize, V: ?Sized + Serialize, { - self.0.serialize_entry(key, &$wrapper(value)) + self.0.serialize_entry(&$wrapper(key), &$wrapper(value)) } fn end(self) -> Result { self.0.end() From d63de9e14cbafaccf829ecd4bb29336ad7d47763 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 22:36:14 +0500 Subject: [PATCH 5/8] Correctly wrap deserializer for `deserialize_in_place` method --- src/configure.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index b70b739..958df40 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -122,6 +122,13 @@ where { T::deserialize(Readable(deserializer)).map(Readable) } + + fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> + where + D: Deserializer<'de>, + { + T::deserialize_in_place(Readable(deserializer), &mut place.0) + } } impl<'de, T> Deserialize<'de> for Compact where @@ -133,6 +140,13 @@ where { T::deserialize(Compact(deserializer)).map(Compact) } + + fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> + where + D: Deserializer<'de>, + { + T::deserialize_in_place(Compact(deserializer), &mut place.0) + } } impl<'de, T> DeserializeSeed<'de> for Readable From dbb1fa9d5867a5069f1d29820eaabbca019dabeb Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 22:47:58 +0500 Subject: [PATCH 6/8] Correctly forward Serializer::collect_seq and collect_map methods --- src/configure.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index 958df40..fb38d77 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -334,6 +334,27 @@ macro_rules! impl_serializer { .serialize_struct_variant(name, variant_index, variant, len) .map($wrapper) } + + fn collect_seq(self, iter: I) -> Result + where + I: IntoIterator, + ::Item: Serialize, + { + self.0 + .collect_seq(iter.into_iter().map(|item| $wrapper(item))) + } + + fn collect_map(self, iter: I) -> Result + where + K: Serialize, + V: Serialize, + I: IntoIterator, + { + self.0.collect_map( + iter.into_iter() + .map(|(key, value)| ($wrapper(key), $wrapper(value))), + ) + } } impl SerializeSeq for $wrapper From d2811930b754fc23800d82c95664a21f2b0efab8 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 23:14:18 +0500 Subject: [PATCH 7/8] Correctly forward skip_field and collect_str to the originals --- src/configure.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index fb38d77..3730bee 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -355,6 +355,13 @@ macro_rules! impl_serializer { .map(|(key, value)| ($wrapper(key), $wrapper(value))), ) } + + fn collect_str(self, value: &T) -> Result + where + T: fmt::Display, + { + self.0.collect_str(value) + } } impl SerializeSeq for $wrapper @@ -467,6 +474,9 @@ macro_rules! impl_serializer { { self.0.serialize_field(name, &$wrapper(field)) } + fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> { + self.0.skip_field(key) + } fn end(self) -> Result { self.0.end() } @@ -484,6 +494,9 @@ macro_rules! impl_serializer { { self.0.serialize_field(name, &$wrapper(field)) } + fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> { + self.0.skip_field(key) + } fn end(self) -> Result { self.0.end() } From ac836f7e54e0cc082dff9677a980c47a73092bf9 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 28 Jul 2024 23:20:52 +0500 Subject: [PATCH 8/8] Correctly forward __private_visit_untagged_option to the original with wrapped deserializer Although this is private serde API, not forwarding it would be error. Unfortunately, another private API, Deserializer::__deserialize_content, cannot be implemented because it accepts private type from serde --- src/configure.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/configure.rs b/src/configure.rs index 3730bee..630d480 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -794,6 +794,17 @@ macro_rules! impl_deserializer { { self.0.visit_enum($wrapper(data)) } + + fn __private_visit_untagged_option( + self, + deserializer: D2, + ) -> Result + where + D2: Deserializer<'de>, + { + self.0 + .__private_visit_untagged_option($wrapper(deserializer)) + } } impl<'de, D> SeqAccess<'de> for $wrapper