@@ -23,11 +23,10 @@ use map::Map;
23
23
use number:: Number ;
24
24
use value:: Value ;
25
25
26
- #[ cfg( feature = "arbitrary_precision" ) ]
27
26
use serde:: de;
28
27
29
28
#[ cfg( feature = "arbitrary_precision" ) ]
30
- use number:: { NumberFromString , SERDE_STRUCT_FIELD_NAME } ;
29
+ use number:: NumberFromString ;
31
30
32
31
impl < ' de > Deserialize < ' de > for Value {
33
32
#[ inline]
@@ -109,44 +108,28 @@ impl<'de> Deserialize<'de> for Value {
109
108
Ok ( Value :: Array ( vec) )
110
109
}
111
110
112
- #[ cfg( not( feature = "arbitrary_precision" ) ) ]
113
- fn visit_map < V > ( self , mut visitor : V ) -> Result < Value , V :: Error >
114
- where
115
- V : MapAccess < ' de > ,
116
- {
117
- let mut values = Map :: new ( ) ;
118
-
119
- while let Some ( ( key, value) ) = try!( visitor. next_entry ( ) ) {
120
- values. insert ( key, value) ;
121
- }
122
-
123
- Ok ( Value :: Object ( values) )
124
- }
125
-
126
- #[ cfg( feature = "arbitrary_precision" ) ]
127
111
fn visit_map < V > ( self , mut visitor : V ) -> Result < Value , V :: Error >
128
112
where
129
113
V : MapAccess < ' de > ,
130
114
{
131
- let mut key = String :: new ( ) ;
132
- let number = visitor. next_key_seed ( NumberOrObject { key : & mut key } ) ?;
133
- match number {
134
- Some ( true ) => {
115
+ match visitor. next_key_seed ( KeyClassifier ) ? {
116
+ #[ cfg( feature = "arbitrary_precision" ) ]
117
+ Some ( KeyClass :: Number ) => {
135
118
let number: NumberFromString = visitor. next_value ( ) ?;
136
119
return Ok ( Value :: Number ( number. value ) ) ;
137
120
}
138
- None => return Ok ( Value :: Object ( Map :: new ( ) ) ) ,
139
- Some ( false ) => { }
140
- }
121
+ Some ( KeyClass :: Map ( first_key) ) => {
122
+ let mut values = Map :: new ( ) ;
141
123
142
- let mut values = Map :: new ( ) ;
124
+ values. insert ( first_key, try!( visitor. next_value ( ) ) ) ;
125
+ while let Some ( ( key, value) ) = try!( visitor. next_entry ( ) ) {
126
+ values. insert ( key, value) ;
127
+ }
143
128
144
- values . insert ( key , try! ( visitor . next_value ( ) ) ) ;
145
- while let Some ( ( key , value ) ) = try! ( visitor . next_entry ( ) ) {
146
- values . insert ( key , value ) ;
129
+ Ok ( Value :: Object ( values ) )
130
+ }
131
+ None => return Ok ( Value :: Object ( Map :: new ( ) ) ) ,
147
132
}
148
-
149
- Ok ( Value :: Object ( values) )
150
133
}
151
134
}
152
135
@@ -1303,14 +1286,16 @@ impl<'de> serde::Deserializer<'de> for MapKeyDeserializer<'de> {
1303
1286
}
1304
1287
}
1305
1288
1306
- #[ cfg( feature = "arbitrary_precision" ) ]
1307
- struct NumberOrObject < ' a > {
1308
- key : & ' a mut String ,
1289
+ struct KeyClassifier ;
1290
+
1291
+ enum KeyClass {
1292
+ Map ( String ) ,
1293
+ #[ cfg( feature = "arbitrary_precision" ) ]
1294
+ Number ,
1309
1295
}
1310
1296
1311
- #[ cfg( feature = "arbitrary_precision" ) ]
1312
- impl < ' a , ' de > DeserializeSeed < ' de > for NumberOrObject < ' a > {
1313
- type Value = bool ;
1297
+ impl < ' de > DeserializeSeed < ' de > for KeyClassifier {
1298
+ type Value = KeyClass ;
1314
1299
1315
1300
fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
1316
1301
where
@@ -1320,35 +1305,32 @@ impl<'a, 'de> DeserializeSeed<'de> for NumberOrObject<'a> {
1320
1305
}
1321
1306
}
1322
1307
1323
- #[ cfg( feature = "arbitrary_precision" ) ]
1324
- impl < ' a , ' de > Visitor < ' de > for NumberOrObject < ' a > {
1325
- type Value = bool ;
1308
+ impl < ' de > Visitor < ' de > for KeyClassifier {
1309
+ type Value = KeyClass ;
1326
1310
1327
1311
fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
1328
1312
formatter. write_str ( "a string key" )
1329
1313
}
1330
1314
1331
- fn visit_str < E > ( self , s : & str ) -> Result < bool , E >
1315
+ fn visit_str < E > ( self , s : & str ) -> Result < Self :: Value , E >
1332
1316
where
1333
1317
E : de:: Error ,
1334
1318
{
1335
- if s == SERDE_STRUCT_FIELD_NAME {
1336
- Ok ( true )
1337
- } else {
1338
- self . key . push_str ( s) ;
1339
- Ok ( false )
1319
+ match s {
1320
+ #[ cfg( feature = "arbitrary_precision" ) ]
1321
+ :: number:: SERDE_STRUCT_FIELD_NAME => Ok ( KeyClass :: Number ) ,
1322
+ _ => Ok ( KeyClass :: Map ( s. to_owned ( ) ) ) ,
1340
1323
}
1341
1324
}
1342
1325
1343
- fn visit_string < E > ( self , s : String ) -> Result < bool , E >
1326
+ fn visit_string < E > ( self , s : String ) -> Result < Self :: Value , E >
1344
1327
where
1345
1328
E : de:: Error ,
1346
1329
{
1347
- if s == SERDE_STRUCT_FIELD_NAME {
1348
- Ok ( true )
1349
- } else {
1350
- * self . key = s;
1351
- Ok ( false )
1330
+ match s. as_str ( ) {
1331
+ #[ cfg( feature = "arbitrary_precision" ) ]
1332
+ :: number:: SERDE_STRUCT_FIELD_NAME => Ok ( KeyClass :: Number ) ,
1333
+ _ => Ok ( KeyClass :: Map ( s) ) ,
1352
1334
}
1353
1335
}
1354
1336
}
0 commit comments