Skip to content

Commit

Permalink
Merge pull request 1914 from Mingun/seq-other
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Jan 24, 2021
2 parents 999b94d + e805717 commit e6b6602
Show file tree
Hide file tree
Showing 11 changed files with 216 additions and 63 deletions.
6 changes: 3 additions & 3 deletions serde/src/private/de.rs
Expand Up @@ -2547,12 +2547,12 @@ pub trait IdentifierDeserializer<'de, E: Error> {
fn borrowed(self) -> Self::BorrowedDeserializer;
}

impl<'de, E> IdentifierDeserializer<'de, E> for u32
impl<'de, E> IdentifierDeserializer<'de, E> for u64
where
E: Error,
{
type Deserializer = <u32 as IntoDeserializer<'de, E>>::Deserializer;
type BorrowedDeserializer = <u32 as IntoDeserializer<'de, E>>::Deserializer;
type Deserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;
type BorrowedDeserializer = <u64 as IntoDeserializer<'de, E>>::Deserializer;

fn from(self) -> Self::Deserializer {
self.into_deserializer()
Expand Down
26 changes: 20 additions & 6 deletions serde_derive/src/de.rs
Expand Up @@ -1965,6 +1965,8 @@ fn deserialize_generated_identifier(
}
}

// Generates `Deserialize::deserialize` body for an enum with
// `serde(field_identifier)` or `serde(variant_identifier)` attribute.
fn deserialize_custom_identifier(
params: &Parameters,
variants: &[Variant],
Expand All @@ -1982,6 +1984,9 @@ fn deserialize_custom_identifier(
let (ordinary, fallthrough) = if let Some(last) = variants.last() {
let last_ident = &last.ident;
if last.attrs.other() {
// Process `serde(other)` attribute. It would always be found on the
// last variant (checked in `check_identifier`), so all preceding
// are ordinary variants.
let ordinary = &variants[..variants.len() - 1];
let fallthrough = quote!(_serde::__private::Ok(#this::#last_ident));
(ordinary, Some((fallthrough.clone(), fallthrough)))
Expand Down Expand Up @@ -2137,7 +2142,8 @@ fn deserialize_identifier(
(None, None, None, None)
};

let (fallthrough_arm, fallthrough_borrowed_arm) = if let Some(fallthrough) = fallthrough {
let (fallthrough_arm, fallthrough_borrowed_arm) = if let Some(fallthrough) = fallthrough.clone()
{
fallthrough
} else if is_variant {
let fallthrough = quote! {
Expand All @@ -2151,8 +2157,19 @@ fn deserialize_identifier(
(fallthrough.clone(), fallthrough)
};

let u64_fallthrough_arm = if let Some((fallthrough, _)) = fallthrough {
fallthrough
} else {
let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
quote! {
_serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&#fallthrough_msg,
))
}
};

let variant_indices = 0_u64..;
let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
let visit_other = if collect_other_fields {
quote! {
fn visit_bool<__E>(self, __value: bool) -> _serde::__private::Result<Self::Value, __E>
Expand Down Expand Up @@ -2256,10 +2273,7 @@ fn deserialize_identifier(
#(
#variant_indices => _serde::__private::Ok(#main_constructors),
)*
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&#fallthrough_msg,
))
_ => #u64_fallthrough_arm,
}
}
}
Expand Down
28 changes: 28 additions & 0 deletions serde_test/src/de.rs
Expand Up @@ -168,14 +168,42 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
self.next_token();
visitor.visit_str(variant)
}
(Token::BorrowedStr(variant), Token::Unit) => {
self.next_token();
visitor.visit_borrowed_str(variant)
}
(Token::String(variant), Token::Unit) => {
self.next_token();
visitor.visit_string(variant.to_string())
}
(Token::Bytes(variant), Token::Unit) => {
self.next_token();
visitor.visit_bytes(variant)
}
(Token::BorrowedBytes(variant), Token::Unit) => {
self.next_token();
visitor.visit_borrowed_bytes(variant)
}
(Token::ByteBuf(variant), Token::Unit) => {
self.next_token();
visitor.visit_byte_buf(variant.to_vec())
}
(Token::U8(variant), Token::Unit) => {
self.next_token();
visitor.visit_u8(variant)
}
(Token::U16(variant), Token::Unit) => {
self.next_token();
visitor.visit_u16(variant)
}
(Token::U32(variant), Token::Unit) => {
self.next_token();
visitor.visit_u32(variant)
}
(Token::U64(variant), Token::Unit) => {
self.next_token();
visitor.visit_u64(variant)
}
(variant, Token::Unit) => unexpected!(variant),
(variant, _) => {
visitor.visit_map(EnumMapVisitor::new(self, variant, EnumFormat::Any))
Expand Down
14 changes: 2 additions & 12 deletions test_suite/tests/expand/de_enum.expanded.rs
Expand Up @@ -614,12 +614,7 @@ const _: () = {
1u64 => _serde::__private::Ok(__Field::__field1),
2u64 => _serde::__private::Ok(__Field::__field2),
3u64 => _serde::__private::Ok(__Field::__field3),
_ => _serde::__private::Err(
_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 4",
),
),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down Expand Up @@ -1152,12 +1147,7 @@ const _: () = {
1u64 => _serde::__private::Ok(__Field::__field1),
2u64 => _serde::__private::Ok(__Field::__field2),
3u64 => _serde::__private::Ok(__Field::__field3),
_ => _serde::__private::Err(
_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 4",
),
),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down
10 changes: 2 additions & 8 deletions test_suite/tests/expand/default_ty_param.expanded.rs
Expand Up @@ -77,10 +77,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down Expand Up @@ -284,10 +281,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down
7 changes: 1 addition & 6 deletions test_suite/tests/expand/generic_enum.expanded.rs
Expand Up @@ -394,12 +394,7 @@ const _: () = {
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
1u64 => _serde::__private::Ok(__Field::__field1),
_ => _serde::__private::Err(
_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 2",
),
),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down
10 changes: 2 additions & 8 deletions test_suite/tests/expand/generic_struct.expanded.rs
Expand Up @@ -73,10 +73,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down Expand Up @@ -280,10 +277,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down
14 changes: 2 additions & 12 deletions test_suite/tests/expand/lifetimes.expanded.rs
Expand Up @@ -281,12 +281,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(
_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
),
),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down Expand Up @@ -494,12 +489,7 @@ const _: () = {
{
match __value {
0u64 => _serde::__private::Ok(__Field::__field0),
_ => _serde::__private::Err(
_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
),
),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down
10 changes: 2 additions & 8 deletions test_suite/tests/expand/named_map.expanded.rs
Expand Up @@ -100,10 +100,7 @@ const _: () = {
0u64 => _serde::__private::Ok(__Field::__field0),
1u64 => _serde::__private::Ok(__Field::__field1),
2u64 => _serde::__private::Ok(__Field::__field2),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 3",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down Expand Up @@ -415,10 +412,7 @@ const _: () = {
0u64 => _serde::__private::Ok(__Field::__field0),
1u64 => _serde::__private::Ok(__Field::__field1),
2u64 => _serde::__private::Ok(__Field::__field2),
_ => _serde::__private::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 3",
)),
_ => _serde::__private::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(
Expand Down

0 comments on commit e6b6602

Please sign in to comment.