Skip to content

Commit

Permalink
Use Deserialize::* methods instead of .parse() for integer keys
Browse files Browse the repository at this point in the history
  • Loading branch information
overdrivenpotato committed Jul 9, 2023
1 parent b0dbac7 commit c4b9759
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 36 deletions.
45 changes: 13 additions & 32 deletions src/de.rs
Expand Up @@ -2118,25 +2118,7 @@ struct MapKey<'a, R: 'a> {
de: &'a mut Deserializer<R>,
}

macro_rules! deserialize_integer_key {
($method:ident => $visit:ident) => {
fn $method<V>(self, visitor: V) -> Result<V::Value>
where
V: de::Visitor<'de>,
{
self.de.eat_char();
self.de.scratch.clear();
let string = tri!(self.de.read.parse_str(&mut self.de.scratch));
match (string.parse(), string) {
(Ok(integer), _) => visitor.$visit(integer),
(Err(_), Reference::Borrowed(s)) => visitor.visit_borrowed_str(s),
(Err(_), Reference::Copied(s)) => visitor.visit_str(s),
}
}
};
}

macro_rules! deserialize_float_key {
macro_rules! deserialize_numeric_key {
($method:ident) => {
fn $method<V>(self, visitor: V) -> Result<V::Value>
where
Expand Down Expand Up @@ -2174,19 +2156,18 @@ where
}
}

deserialize_integer_key!(deserialize_i8 => visit_i8);
deserialize_integer_key!(deserialize_i16 => visit_i16);
deserialize_integer_key!(deserialize_i32 => visit_i32);
deserialize_integer_key!(deserialize_i64 => visit_i64);
deserialize_integer_key!(deserialize_i128 => visit_i128);
deserialize_integer_key!(deserialize_u8 => visit_u8);
deserialize_integer_key!(deserialize_u16 => visit_u16);
deserialize_integer_key!(deserialize_u32 => visit_u32);
deserialize_integer_key!(deserialize_u64 => visit_u64);
deserialize_integer_key!(deserialize_u128 => visit_u128);

deserialize_float_key!(deserialize_f32);
deserialize_float_key!(deserialize_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_i128);
deserialize_numeric_key!(deserialize_u8);
deserialize_numeric_key!(deserialize_u16);
deserialize_numeric_key!(deserialize_u32);
deserialize_numeric_key!(deserialize_u64);
deserialize_numeric_key!(deserialize_u128);
deserialize_numeric_key!(deserialize_f32);
deserialize_numeric_key!(deserialize_f64);

#[inline]
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
Expand Down
5 changes: 1 addition & 4 deletions tests/test.rs
Expand Up @@ -1897,10 +1897,7 @@ fn test_integer_key() {
test_parse_ok(vec![(j, map)]);

let j = r#"{"x":null}"#;
test_parse_err::<BTreeMap<i32, ()>>(&[(
j,
"invalid type: string \"x\", expected i32 at line 1 column 4",
)]);
test_parse_err::<BTreeMap<i32, ()>>(&[(j, "expected value at line 1 column 3")]);
}

#[test]
Expand Down

0 comments on commit c4b9759

Please sign in to comment.