@@ -46,7 +46,10 @@ use core::{
46
46
} ;
47
47
48
48
#[ cfg( feature = "serde" ) ]
49
- use serde:: { de:: Visitor , Deserialize , Deserializer , Serialize } ;
49
+ use serde:: {
50
+ de:: { Error as _, Unexpected } ,
51
+ Deserialize , Deserializer , Serialize ,
52
+ } ;
50
53
51
54
/// The largest integer value that can be represented exactly by an f64.
52
55
pub const MAX_SAFE_INT : i64 = 0x001F_FFFF_FFFF_FFFF ;
@@ -518,73 +521,13 @@ impl<'de> Deserialize<'de> for Int {
518
521
where
519
522
D : Deserializer < ' de > ,
520
523
{
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
+ } )
588
531
}
589
532
}
590
533
@@ -1037,73 +980,13 @@ impl<'de> Deserialize<'de> for UInt {
1037
980
where
1038
981
D : Deserializer < ' de > ,
1039
982
{
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
+ } )
1107
990
}
1108
991
}
1109
992
0 commit comments