mirror of
https://github.com/serde-rs/serde.git
synced 2025-10-02 15:25:38 +00:00
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:
parent
34de1e00c8
commit
0737474640
@ -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,
|
}
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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>(
|
||||||
|
@ -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>
|
||||||
|
@ -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>(
|
||||||
|
@ -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>
|
||||||
|
@ -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>(
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user