From dcd2232f6984c03dc79ded2080ae9bcd125eb2ab Mon Sep 17 00:00:00 2001 From: roblabla Date: Tue, 11 Sep 2018 17:12:37 +0000 Subject: [PATCH] Enforce unit struct for #[serde(other)] --- serde_derive/src/de.rs | 4 ++-- serde_derive/src/internals/check.rs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 7cfb959b..69def6a6 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1866,8 +1866,8 @@ fn deserialize_generated_identifier( let ignore_variant = quote!(__other(_serde::private::de::Content<'de>),); let fallthrough = quote!(_serde::export::Ok(__Field::__other(__value))); (Some(ignore_variant), Some(fallthrough)) - } else if other_idx.is_some() { - let ignore_variant = fields[other_idx.unwrap()].1.clone(); + } else if let Some(other_idx) = other_idx { + let ignore_variant = fields[other_idx].1.clone(); let fallthrough = quote!(_serde::export::Ok(__Field::#ignore_variant)); (None, Some(fallthrough)) } else if is_variant || cattrs.deny_unknown_fields() { diff --git a/serde_derive/src/internals/check.rs b/serde_derive/src/internals/check.rs index 516afeab..54738f4e 100644 --- a/serde_derive/src/internals/check.rs +++ b/serde_derive/src/internals/check.rs @@ -124,15 +124,14 @@ fn check_identifier(cx: &Ctxt, cont: &Container) { } // Variant with `other` attribute must be the last one. - (Style::Unit, Identifier::Field, true, _) | (_, Identifier::No, true, _) => { + (Style::Unit, Identifier::Field, true, _) | (Style::Unit, Identifier::No, true, _) => { if i < variants.len() - 1 { cx.error("#[serde(other)] must be the last variant"); } } // Variant with `other` attribute must be a unit variant. - // TODO: Only in field_identifier ? - (_, Identifier::Field, true, _) => { + (_, Identifier::Field, true, _) | (_, Identifier::No, true, _) => { cx.error("#[serde(other)] must be on a unit variant"); },