Skip to content

Commit e81a27e

Browse files
committed
Rewrite Deserialize implementations
The new implementation delegates to underlying integer type instead of visitor, which is much shorter and allows correct deserialization of the integer types in non-self-describing formats
1 parent 6cf9c7e commit e81a27e

File tree

2 files changed

+20
-135
lines changed

2 files changed

+20
-135
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# [unreleased]
22

3+
* Allow deserialization of `Int`s and `UInt`s from non-self-describing formats
4+
35
# 0.1.3
46

57
* Add conversions to / from 128 bit integer types

src/lib.rs

Lines changed: 18 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ use core::{
4646
};
4747

4848
#[cfg(feature = "serde")]
49-
use serde::{de::Visitor, Deserialize, Deserializer, Serialize};
49+
use serde::{
50+
de::{Error as _, Unexpected},
51+
Deserialize, Deserializer, Serialize,
52+
};
5053

5154
/// The largest integer value that can be represented exactly by an f64.
5255
pub const MAX_SAFE_INT: i64 = 0x001F_FFFF_FFFF_FFFF;
@@ -518,73 +521,13 @@ impl<'de> Deserialize<'de> for Int {
518521
where
519522
D: Deserializer<'de>,
520523
{
521-
struct IntVisitor;
522-
523-
impl<'de> Visitor<'de> for IntVisitor {
524-
type Value = Int;
525-
526-
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
527-
formatter.write_str("a signed integer between -(2**53) + 1 and (2**53) - 1")
528-
}
529-
530-
fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E>
531-
where
532-
E: serde::de::Error,
533-
{
534-
Ok(Int::from(value))
535-
}
536-
537-
fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E>
538-
where
539-
E: serde::de::Error,
540-
{
541-
Ok(Int::from(value))
542-
}
543-
544-
fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
545-
where
546-
E: serde::de::Error,
547-
{
548-
Ok(Int::from(value))
549-
}
550-
551-
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
552-
where
553-
E: serde::de::Error,
554-
{
555-
Ok(Int::try_from(value).map_err(|_| E::custom("out of bounds"))?)
556-
}
557-
558-
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
559-
where
560-
E: serde::de::Error,
561-
{
562-
Ok(Int::from(value))
563-
}
564-
565-
fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
566-
where
567-
E: serde::de::Error,
568-
{
569-
Ok(Int::from(value))
570-
}
571-
572-
fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
573-
where
574-
E: serde::de::Error,
575-
{
576-
Ok(Int::from(value))
577-
}
578-
579-
fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
580-
where
581-
E: serde::de::Error,
582-
{
583-
Ok(Int::try_from(value).map_err(|_| E::custom("out of bounds"))?)
584-
}
585-
}
586-
587-
deserializer.deserialize_any(IntVisitor)
524+
let val = i64::deserialize(deserializer)?;
525+
Self::new(val).ok_or_else(|| {
526+
D::Error::invalid_value(
527+
Unexpected::Signed(val),
528+
&"an integer between -2^53 + 1 and 2^53 - 1",
529+
)
530+
})
588531
}
589532
}
590533

@@ -1037,73 +980,13 @@ impl<'de> Deserialize<'de> for UInt {
1037980
where
1038981
D: Deserializer<'de>,
1039982
{
1040-
struct UIntVisitor;
1041-
1042-
impl<'de> Visitor<'de> for UIntVisitor {
1043-
type Value = UInt;
1044-
1045-
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
1046-
formatter.write_str("an unsigned integer between 0 and (2**53) - 1")
1047-
}
1048-
1049-
fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E>
1050-
where
1051-
E: serde::de::Error,
1052-
{
1053-
Ok(UInt::try_from(value).map_err(|_| E::custom("out of bounds"))?)
1054-
}
1055-
1056-
fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E>
1057-
where
1058-
E: serde::de::Error,
1059-
{
1060-
Ok(UInt::try_from(value).map_err(|_| E::custom("out of bounds"))?)
1061-
}
1062-
1063-
fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
1064-
where
1065-
E: serde::de::Error,
1066-
{
1067-
Ok(UInt::try_from(value).map_err(|_| E::custom("out of bounds"))?)
1068-
}
1069-
1070-
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
1071-
where
1072-
E: serde::de::Error,
1073-
{
1074-
Ok(UInt::try_from(value).map_err(|_| E::custom("out of bounds"))?)
1075-
}
1076-
1077-
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
1078-
where
1079-
E: serde::de::Error,
1080-
{
1081-
Ok(UInt::from(value))
1082-
}
1083-
1084-
fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
1085-
where
1086-
E: serde::de::Error,
1087-
{
1088-
Ok(UInt::from(value))
1089-
}
1090-
1091-
fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
1092-
where
1093-
E: serde::de::Error,
1094-
{
1095-
Ok(UInt::from(value))
1096-
}
1097-
1098-
fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
1099-
where
1100-
E: serde::de::Error,
1101-
{
1102-
Ok(UInt::try_from(value).map_err(|_| E::custom("out of bounds"))?)
1103-
}
1104-
}
1105-
1106-
deserializer.deserialize_any(UIntVisitor)
983+
let val = u64::deserialize(deserializer)?;
984+
Self::new(val).ok_or_else(|| {
985+
D::Error::invalid_value(
986+
Unexpected::Unsigned(val),
987+
&"an integer between 0 and 2^53 - 1",
988+
)
989+
})
1107990
}
1108991
}
1109992

0 commit comments

Comments
 (0)