From a0b23cbf02cc1422a95367c0bea0f41d8605c78e Mon Sep 17 00:00:00 2001 From: David Ross Date: Tue, 4 Dec 2018 19:35:32 -0800 Subject: [PATCH 1/3] Accept integers variant encoding in Content This allows ContentDeserializer and ContentRefDeserializer to deserialize unsigned integers in deserialize_identifier, and furthermore allows enums inside untagged enums to be correctly decoded in formats which encode the enum variant as an integer. Fixes https://github.com/serde-rs/serde/issues/1437. --- serde/src/private/de.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index f7219b2c..dab463d0 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1419,6 +1419,10 @@ mod content { Content::Str(v) => visitor.visit_borrowed_str(v), Content::ByteBuf(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), + Content::U8(v) => visitor.visit_u8(v), + Content::U16(v) => visitor.visit_u16(v), + Content::U32(v) => visitor.visit_u32(v), + Content::U64(v) => visitor.visit_u64(v), _ => Err(self.invalid_type(&visitor)), } } @@ -2121,6 +2125,10 @@ mod content { Content::Str(v) => visitor.visit_borrowed_str(v), Content::ByteBuf(ref v) => visitor.visit_bytes(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), + Content::U8(v) => visitor.visit_u8(v), + Content::U16(v) => visitor.visit_u16(v), + Content::U32(v) => visitor.visit_u32(v), + Content::U64(v) => visitor.visit_u64(v), _ => Err(self.invalid_type(&visitor)), } } From 86faa449151a3213faa0bf724ec95380fa4f78e5 Mon Sep 17 00:00:00 2001 From: David Ross Date: Wed, 5 Dec 2018 15:56:58 -0800 Subject: [PATCH 2/3] Support only u8,u32 for enum variant identifiers in Content. u8 correctly supports msgpack-rust, and u32 supports bincode and presumably all other similar binary formats. --- serde/src/private/de.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index dab463d0..a6138262 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1420,9 +1420,7 @@ mod content { Content::ByteBuf(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), _ => Err(self.invalid_type(&visitor)), } } @@ -2126,9 +2124,7 @@ mod content { Content::ByteBuf(ref v) => visitor.visit_bytes(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), - Content::U16(v) => visitor.visit_u16(v), Content::U32(v) => visitor.visit_u32(v), - Content::U64(v) => visitor.visit_u64(v), _ => Err(self.invalid_type(&visitor)), } } From cf1e0825c161a8bc31d81315ee8268fd142f4217 Mon Sep 17 00:00:00 2001 From: David Ross Date: Wed, 5 Dec 2018 17:01:16 -0800 Subject: [PATCH 3/3] Support only u8 for enum identifiers within Content. --- serde/src/private/de.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index a6138262..18335d00 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1420,7 +1420,6 @@ mod content { Content::ByteBuf(v) => visitor.visit_byte_buf(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), - Content::U32(v) => visitor.visit_u32(v), _ => Err(self.invalid_type(&visitor)), } } @@ -2124,7 +2123,6 @@ mod content { Content::ByteBuf(ref v) => visitor.visit_bytes(v), Content::Bytes(v) => visitor.visit_borrowed_bytes(v), Content::U8(v) => visitor.visit_u8(v), - Content::U32(v) => visitor.visit_u32(v), _ => Err(self.invalid_type(&visitor)), } }