Allow field identifiers be any numbers if #[serde(other)] is used

Thus behavior synchronized between string/bytes identifiers and numeric identifiers
This commit is contained in:
Mingun 2020-10-22 10:18:27 +05:00
parent 34de1e00c8
commit 0737474640
7 changed files with 42 additions and 50 deletions

View File

@ -1940,6 +1940,15 @@ fn deserialize_generated_identifier(
} }
} }
/// Generates `Deserialize::deserialize` body for
/// ```ignore
/// #[serde(field_identifier)]
/// enum Field {
/// }
/// #[serde(variant_identifier)]
/// enum Variant {
/// }
/// ```
fn deserialize_custom_identifier( fn deserialize_custom_identifier(
params: &Parameters, params: &Parameters,
variants: &[Variant], variants: &[Variant],
@ -1957,6 +1966,8 @@ fn deserialize_custom_identifier(
let (ordinary, fallthrough) = if let Some(last) = variants.last() { let (ordinary, fallthrough) = if let Some(last) = variants.last() {
let last_ident = &last.ident; let last_ident = &last.ident;
if last.attrs.other() { if last.attrs.other() {
// Processes `#[serde(other)]` attribute. It always belongs to the last variant
// (checked in `check_identifier`), so all other are ordinal variants
let ordinary = &variants[..variants.len() - 1]; let ordinary = &variants[..variants.len() - 1];
let fallthrough = quote!(_serde::export::Ok(#this::#last_ident)); let fallthrough = quote!(_serde::export::Ok(#this::#last_ident));
(ordinary, Some(fallthrough)) (ordinary, Some(fallthrough))
@ -1976,6 +1987,10 @@ fn deserialize_custom_identifier(
(variants, None) (variants, None)
}; };
// List of tuples:
// - field or variant name in the expected messages
// - information about field/variant
// - list of alternate names of the field/variant
let names_idents: Vec<_> = ordinary let names_idents: Vec<_> = ordinary
.iter() .iter()
.map(|variant| { .map(|variant| {
@ -2106,7 +2121,7 @@ fn deserialize_identifier(
(None, None, None, None) (None, None, None, None)
}; };
let fallthrough_arm = if let Some(fallthrough) = fallthrough { let fallthrough_arm = if let Some(fallthrough) = fallthrough.clone() {
fallthrough fallthrough
} else if is_variant { } else if is_variant {
quote! { quote! {
@ -2118,8 +2133,19 @@ fn deserialize_identifier(
} }
}; };
let variant_indices = 0_u64..; let u64_fallthrough_arm = if let Some(fallthrough) = fallthrough {
fallthrough
} else {
let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len()); let fallthrough_msg = format!("{} index 0 <= i < {}", index_expecting, fields.len());
quote! {
_serde::export::Err(_serde::de::Error::invalid_value(
_serde::de::Unexpected::Unsigned(__value),
&#fallthrough_msg,
))
}
};
let variant_indices = 0_u64..;
let visit_other = if collect_other_fields { let visit_other = if collect_other_fields {
quote! { quote! {
fn visit_bool<__E>(self, __value: bool) -> _serde::export::Result<Self::Value, __E> fn visit_bool<__E>(self, __value: bool) -> _serde::export::Result<Self::Value, __E>
@ -2254,10 +2280,9 @@ fn deserialize_identifier(
#( #(
#variant_indices => _serde::export::Ok(#main_constructors), #variant_indices => _serde::export::Ok(#main_constructors),
)* )*
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => {
_serde::de::Unexpected::Unsigned(__value), #u64_fallthrough_arm
&#fallthrough_msg, }
))
} }
} }
} }

View File

@ -563,10 +563,7 @@ const _: () = {
1u64 => _serde::export::Ok(__Field::__field1), 1u64 => _serde::export::Ok(__Field::__field1),
2u64 => _serde::export::Ok(__Field::__field2), 2u64 => _serde::export::Ok(__Field::__field2),
3u64 => _serde::export::Ok(__Field::__field3), 3u64 => _serde::export::Ok(__Field::__field3),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 4",
)),
} }
} }
fn visit_str<__E>( fn visit_str<__E>(
@ -1066,10 +1063,7 @@ const _: () = {
1u64 => _serde::export::Ok(__Field::__field1), 1u64 => _serde::export::Ok(__Field::__field1),
2u64 => _serde::export::Ok(__Field::__field2), 2u64 => _serde::export::Ok(__Field::__field2),
3u64 => _serde::export::Ok(__Field::__field3), 3u64 => _serde::export::Ok(__Field::__field3),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 4",
)),
} }
} }
fn visit_str<__E>( fn visit_str<__E>(

View File

@ -74,10 +74,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
@ -250,10 +247,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>

View File

@ -347,10 +347,7 @@ const _: () = {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
1u64 => _serde::export::Ok(__Field::__field1), 1u64 => _serde::export::Ok(__Field::__field1),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 2",
)),
} }
} }
fn visit_str<__E>( fn visit_str<__E>(

View File

@ -70,10 +70,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
@ -246,10 +243,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>

View File

@ -235,10 +235,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>( fn visit_str<__E>(
@ -420,10 +417,7 @@ const _: () = {
{ {
match __value { match __value {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 1",
)),
} }
} }
fn visit_str<__E>( fn visit_str<__E>(

View File

@ -97,10 +97,7 @@ const _: () = {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
1u64 => _serde::export::Ok(__Field::__field1), 1u64 => _serde::export::Ok(__Field::__field1),
2u64 => _serde::export::Ok(__Field::__field2), 2u64 => _serde::export::Ok(__Field::__field2),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 3",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>
@ -373,10 +370,7 @@ const _: () = {
0u64 => _serde::export::Ok(__Field::__field0), 0u64 => _serde::export::Ok(__Field::__field0),
1u64 => _serde::export::Ok(__Field::__field1), 1u64 => _serde::export::Ok(__Field::__field1),
2u64 => _serde::export::Ok(__Field::__field2), 2u64 => _serde::export::Ok(__Field::__field2),
_ => _serde::export::Err(_serde::de::Error::invalid_value( _ => _serde::export::Ok(__Field::__ignore),
_serde::de::Unexpected::Unsigned(__value),
&"field index 0 <= i < 3",
)),
} }
} }
fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E> fn visit_str<__E>(self, __value: &str) -> _serde::export::Result<Self::Value, __E>