From c91c33436d7aaef7472ebc18b734ddc9b5bd11fa Mon Sep 17 00:00:00 2001 From: Emil Bonne Kristiansen Date: Tue, 21 Nov 2023 02:13:18 +0100 Subject: [PATCH] Fix Range{From,To} deserialize mixup --- serde/src/de/impls.rs | 284 +++++++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 1f05c533..6675f620 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -2509,7 +2509,7 @@ where where D: Deserializer<'de>, { - let start = tri!(deserializer.deserialize_struct( + let end = tri!(deserializer.deserialize_struct( "RangeFrom", range_from::FIELDS, range_from::RangeFromVisitor { @@ -2517,7 +2517,7 @@ where phantom: PhantomData, }, )); - Ok(start..) + Ok(end..) } } @@ -2526,144 +2526,6 @@ mod range_from { use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; - pub const FIELDS: &[&str] = &["end"]; - - // If this were outside of the serde crate, it would just use: - // - // #[derive(Deserialize)] - // #[serde(field_identifier, rename_all = "lowercase")] - enum Field { - End, - } - - impl<'de> Deserialize<'de> for Field { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct FieldVisitor; - - impl<'de> Visitor<'de> for FieldVisitor { - type Value = Field; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("`end`") - } - - fn visit_str(self, value: &str) -> Result - where - E: Error, - { - match value { - "end" => Ok(Field::End), - _ => Err(Error::unknown_field(value, FIELDS)), - } - } - - fn visit_bytes(self, value: &[u8]) -> Result - where - E: Error, - { - match value { - b"end" => Ok(Field::End), - _ => { - let value = crate::__private::from_utf8_lossy(value); - Err(Error::unknown_field(&*value, FIELDS)) - } - } - } - } - - deserializer.deserialize_identifier(FieldVisitor) - } - } - - pub struct RangeFromVisitor { - pub expecting: &'static str, - pub phantom: PhantomData, - } - - impl<'de, Idx> Visitor<'de> for RangeFromVisitor - where - Idx: Deserialize<'de>, - { - type Value = Idx; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str(self.expecting) - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - let end: Idx = match tri!(seq.next_element()) { - Some(value) => value, - None => { - return Err(Error::invalid_length(0, &self)); - } - }; - Ok(end) - } - - fn visit_map(self, mut map: A) -> Result - where - A: MapAccess<'de>, - { - let mut end: Option = None; - while let Some(key) = tri!(map.next_key()) { - match key { - Field::End => { - if end.is_some() { - return Err(::duplicate_field("end")); - } - end = Some(tri!(map.next_value())); - } - } - } - let end = match end { - Some(end) => end, - None => return Err(::missing_field("end")), - }; - Ok(end) - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -// Similar to: -// -// #[derive(Deserialize)] -// #[serde(deny_unknown_fields)] -// struct RangeTo { -// start: Idx, -// } -impl<'de, Idx> Deserialize<'de> for RangeTo -where - Idx: Deserialize<'de>, -{ - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let end = tri!(deserializer.deserialize_struct( - "RangeTo", - range_to::FIELDS, - range_to::RangeToVisitor { - expecting: "struct RangeTo", - phantom: PhantomData, - }, - )); - Ok(..end) - } -} - -mod range_to { - use crate::lib::*; - - use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; - pub const FIELDS: &[&str] = &["start"]; // If this were outside of the serde crate, it would just use: @@ -2716,12 +2578,12 @@ mod range_to { } } - pub struct RangeToVisitor { + pub struct RangeFromVisitor { pub expecting: &'static str, pub phantom: PhantomData, } - impl<'de, Idx> Visitor<'de> for RangeToVisitor + impl<'de, Idx> Visitor<'de> for RangeFromVisitor where Idx: Deserialize<'de>, { @@ -2770,6 +2632,144 @@ mod range_to { //////////////////////////////////////////////////////////////////////////////// +// Similar to: +// +// #[derive(Deserialize)] +// #[serde(deny_unknown_fields)] +// struct RangeTo { +// start: Idx, +// } +impl<'de, Idx> Deserialize<'de> for RangeTo +where + Idx: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let start = tri!(deserializer.deserialize_struct( + "RangeTo", + range_to::FIELDS, + range_to::RangeToVisitor { + expecting: "struct RangeTo", + phantom: PhantomData, + }, + )); + Ok(..start) + } +} + +mod range_to { + use crate::lib::*; + + use crate::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor}; + + pub const FIELDS: &[&str] = &["end"]; + + // If this were outside of the serde crate, it would just use: + // + // #[derive(Deserialize)] + // #[serde(field_identifier, rename_all = "lowercase")] + enum Field { + End, + } + + impl<'de> Deserialize<'de> for Field { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct FieldVisitor; + + impl<'de> Visitor<'de> for FieldVisitor { + type Value = Field; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("`end`") + } + + fn visit_str(self, value: &str) -> Result + where + E: Error, + { + match value { + "end" => Ok(Field::End), + _ => Err(Error::unknown_field(value, FIELDS)), + } + } + + fn visit_bytes(self, value: &[u8]) -> Result + where + E: Error, + { + match value { + b"end" => Ok(Field::End), + _ => { + let value = crate::__private::from_utf8_lossy(value); + Err(Error::unknown_field(&*value, FIELDS)) + } + } + } + } + + deserializer.deserialize_identifier(FieldVisitor) + } + } + + pub struct RangeToVisitor { + pub expecting: &'static str, + pub phantom: PhantomData, + } + + impl<'de, Idx> Visitor<'de> for RangeToVisitor + where + Idx: Deserialize<'de>, + { + type Value = Idx; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str(self.expecting) + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let end: Idx = match tri!(seq.next_element()) { + Some(value) => value, + None => { + return Err(Error::invalid_length(0, &self)); + } + }; + Ok(end) + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let mut end: Option = None; + while let Some(key) = tri!(map.next_key()) { + match key { + Field::End => { + if end.is_some() { + return Err(::duplicate_field("end")); + } + end = Some(tri!(map.next_value())); + } + } + } + let end = match end { + Some(end) => end, + None => return Err(::missing_field("end")), + }; + Ok(end) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// + impl<'de, T> Deserialize<'de> for Bound where T: Deserialize<'de>,