Skip to content

Commit

Permalink
Directly use caller's Visitor to deserialize numeric key from Value
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Jul 11, 2023
1 parent 0770869 commit defa896
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 19 deletions.
8 changes: 4 additions & 4 deletions src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
self.fix_position(err)
}

fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
pub(crate) fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
where
V: de::Visitor<'any>,
{
Expand All @@ -336,7 +336,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
}

#[cfg(feature = "float_roundtrip")]
fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
pub(crate) fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
where
V: de::Visitor<'any>,
{
Expand All @@ -346,7 +346,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
val
}

fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
pub(crate) fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
where
V: de::Visitor<'any>,
{
Expand Down Expand Up @@ -378,7 +378,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
}
}

fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
pub(crate) fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
where
V: de::Visitor<'any>,
{
Expand Down
38 changes: 23 additions & 15 deletions src/value/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1121,15 +1121,19 @@ struct MapKeyDeserializer<'de> {
}

macro_rules! deserialize_numeric_key {
($method:ident => $visit:ident) => {
($method:ident) => {
deserialize_numeric_key!($method, deserialize_number);
};

($method:ident, $using:ident) => {
fn $method<V>(self, visitor: V) -> Result<V::Value, Error>
where
V: Visitor<'de>,
{
let mut de = crate::Deserializer::from_str(&self.key);
let parsed = tri!(Deserialize::deserialize(&mut de));
let number = tri!(de.$using(visitor));
tri!(de.end());
visitor.$visit(parsed)
Ok(number)
}
};
}
Expand All @@ -1144,18 +1148,22 @@ impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
BorrowedCowStrDeserializer::new(self.key).deserialize_any(visitor)
}

deserialize_numeric_key!(deserialize_i8 => visit_i8);
deserialize_numeric_key!(deserialize_i16 => visit_i16);
deserialize_numeric_key!(deserialize_i32 => visit_i32);
deserialize_numeric_key!(deserialize_i64 => visit_i64);
deserialize_numeric_key!(deserialize_i128 => visit_i128);
deserialize_numeric_key!(deserialize_u8 => visit_u8);
deserialize_numeric_key!(deserialize_u16 => visit_u16);
deserialize_numeric_key!(deserialize_u32 => visit_u32);
deserialize_numeric_key!(deserialize_u64 => visit_u64);
deserialize_numeric_key!(deserialize_u128 => visit_u128);
deserialize_numeric_key!(deserialize_f32 => visit_f32);
deserialize_numeric_key!(deserialize_f64 => visit_f64);
deserialize_numeric_key!(deserialize_i8);
deserialize_numeric_key!(deserialize_i16);
deserialize_numeric_key!(deserialize_i32);
deserialize_numeric_key!(deserialize_i64);
deserialize_numeric_key!(deserialize_u8);
deserialize_numeric_key!(deserialize_u16);
deserialize_numeric_key!(deserialize_u32);
deserialize_numeric_key!(deserialize_u64);
#[cfg(not(feature = "float_roundtrip"))]
deserialize_numeric_key!(deserialize_f32);
deserialize_numeric_key!(deserialize_f64);

#[cfg(feature = "float_roundtrip")]
deserialize_numeric_key!(deserialize_f32, do_deserialize_f32);
deserialize_numeric_key!(deserialize_i128, do_deserialize_i128);
deserialize_numeric_key!(deserialize_u128, do_deserialize_u128);

#[inline]
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
Expand Down

0 comments on commit defa896

Please sign in to comment.