@@ -209,7 +209,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
209
209
self . disable_recursion_limit = true ;
210
210
}
211
211
212
- fn peek ( & mut self ) -> Result < Option < u8 > > {
212
+ pub ( crate ) fn peek ( & mut self ) -> Result < Option < u8 > > {
213
213
self . read . peek ( )
214
214
}
215
215
@@ -309,9 +309,9 @@ impl<'de, R: Read<'de>> Deserializer<R> {
309
309
self . fix_position ( err)
310
310
}
311
311
312
- fn deserialize_number < V > ( & mut self , visitor : V ) -> Result < V :: Value >
312
+ pub ( crate ) fn deserialize_number < ' any , V > ( & mut self , visitor : V ) -> Result < V :: Value >
313
313
where
314
- V : de:: Visitor < ' de > ,
314
+ V : de:: Visitor < ' any > ,
315
315
{
316
316
let peek = match tri ! ( self . parse_whitespace( ) ) {
317
317
Some ( b) => b,
@@ -335,6 +335,79 @@ impl<'de, R: Read<'de>> Deserializer<R> {
335
335
}
336
336
}
337
337
338
+ #[ cfg( feature = "float_roundtrip" ) ]
339
+ pub ( crate ) fn do_deserialize_f32 < ' any , V > ( & mut self , visitor : V ) -> Result < V :: Value >
340
+ where
341
+ V : de:: Visitor < ' any > ,
342
+ {
343
+ self . single_precision = true ;
344
+ let val = self . deserialize_number ( visitor) ;
345
+ self . single_precision = false ;
346
+ val
347
+ }
348
+
349
+ pub ( crate ) fn do_deserialize_i128 < ' any , V > ( & mut self , visitor : V ) -> Result < V :: Value >
350
+ where
351
+ V : de:: Visitor < ' any > ,
352
+ {
353
+ let mut buf = String :: new ( ) ;
354
+
355
+ match tri ! ( self . parse_whitespace( ) ) {
356
+ Some ( b'-' ) => {
357
+ self . eat_char ( ) ;
358
+ buf. push ( '-' ) ;
359
+ }
360
+ Some ( _) => { }
361
+ None => {
362
+ return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
363
+ }
364
+ } ;
365
+
366
+ tri ! ( self . scan_integer128( & mut buf) ) ;
367
+
368
+ let value = match buf. parse ( ) {
369
+ Ok ( int) => visitor. visit_i128 ( int) ,
370
+ Err ( _) => {
371
+ return Err ( self . error ( ErrorCode :: NumberOutOfRange ) ) ;
372
+ }
373
+ } ;
374
+
375
+ match value {
376
+ Ok ( value) => Ok ( value) ,
377
+ Err ( err) => Err ( self . fix_position ( err) ) ,
378
+ }
379
+ }
380
+
381
+ pub ( crate ) fn do_deserialize_u128 < ' any , V > ( & mut self , visitor : V ) -> Result < V :: Value >
382
+ where
383
+ V : de:: Visitor < ' any > ,
384
+ {
385
+ match tri ! ( self . parse_whitespace( ) ) {
386
+ Some ( b'-' ) => {
387
+ return Err ( self . peek_error ( ErrorCode :: NumberOutOfRange ) ) ;
388
+ }
389
+ Some ( _) => { }
390
+ None => {
391
+ return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
392
+ }
393
+ }
394
+
395
+ let mut buf = String :: new ( ) ;
396
+ tri ! ( self . scan_integer128( & mut buf) ) ;
397
+
398
+ let value = match buf. parse ( ) {
399
+ Ok ( int) => visitor. visit_u128 ( int) ,
400
+ Err ( _) => {
401
+ return Err ( self . error ( ErrorCode :: NumberOutOfRange ) ) ;
402
+ }
403
+ } ;
404
+
405
+ match value {
406
+ Ok ( value) => Ok ( value) ,
407
+ Err ( err) => Err ( self . fix_position ( err) ) ,
408
+ }
409
+ }
410
+
338
411
fn scan_integer128 ( & mut self , buf : & mut String ) -> Result < ( ) > {
339
412
match tri ! ( self . next_char_or_null( ) ) {
340
413
b'0' => {
@@ -1258,11 +1331,15 @@ static POW10: [f64; 309] = [
1258
1331
1259
1332
macro_rules! deserialize_number {
1260
1333
( $method: ident) => {
1334
+ deserialize_number!( $method, deserialize_number) ;
1335
+ } ;
1336
+
1337
+ ( $method: ident, $using: ident) => {
1261
1338
fn $method<V >( self , visitor: V ) -> Result <V :: Value >
1262
1339
where
1263
1340
V : de:: Visitor <' de>,
1264
1341
{
1265
- self . deserialize_number ( visitor)
1342
+ self . $using ( visitor)
1266
1343
}
1267
1344
} ;
1268
1345
}
@@ -1424,77 +1501,9 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1424
1501
deserialize_number ! ( deserialize_f64) ;
1425
1502
1426
1503
#[ cfg( feature = "float_roundtrip" ) ]
1427
- fn deserialize_f32 < V > ( self , visitor : V ) -> Result < V :: Value >
1428
- where
1429
- V : de:: Visitor < ' de > ,
1430
- {
1431
- self . single_precision = true ;
1432
- let val = self . deserialize_number ( visitor) ;
1433
- self . single_precision = false ;
1434
- val
1435
- }
1436
-
1437
- fn deserialize_i128 < V > ( self , visitor : V ) -> Result < V :: Value >
1438
- where
1439
- V : de:: Visitor < ' de > ,
1440
- {
1441
- let mut buf = String :: new ( ) ;
1442
-
1443
- match tri ! ( self . parse_whitespace( ) ) {
1444
- Some ( b'-' ) => {
1445
- self . eat_char ( ) ;
1446
- buf. push ( '-' ) ;
1447
- }
1448
- Some ( _) => { }
1449
- None => {
1450
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1451
- }
1452
- } ;
1453
-
1454
- tri ! ( self . scan_integer128( & mut buf) ) ;
1455
-
1456
- let value = match buf. parse ( ) {
1457
- Ok ( int) => visitor. visit_i128 ( int) ,
1458
- Err ( _) => {
1459
- return Err ( self . error ( ErrorCode :: NumberOutOfRange ) ) ;
1460
- }
1461
- } ;
1462
-
1463
- match value {
1464
- Ok ( value) => Ok ( value) ,
1465
- Err ( err) => Err ( self . fix_position ( err) ) ,
1466
- }
1467
- }
1468
-
1469
- fn deserialize_u128 < V > ( self , visitor : V ) -> Result < V :: Value >
1470
- where
1471
- V : de:: Visitor < ' de > ,
1472
- {
1473
- match tri ! ( self . parse_whitespace( ) ) {
1474
- Some ( b'-' ) => {
1475
- return Err ( self . peek_error ( ErrorCode :: NumberOutOfRange ) ) ;
1476
- }
1477
- Some ( _) => { }
1478
- None => {
1479
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1480
- }
1481
- }
1482
-
1483
- let mut buf = String :: new ( ) ;
1484
- tri ! ( self . scan_integer128( & mut buf) ) ;
1485
-
1486
- let value = match buf. parse ( ) {
1487
- Ok ( int) => visitor. visit_u128 ( int) ,
1488
- Err ( _) => {
1489
- return Err ( self . error ( ErrorCode :: NumberOutOfRange ) ) ;
1490
- }
1491
- } ;
1492
-
1493
- match value {
1494
- Ok ( value) => Ok ( value) ,
1495
- Err ( err) => Err ( self . fix_position ( err) ) ,
1496
- }
1497
- }
1504
+ deserialize_number ! ( deserialize_f32, do_deserialize_f32) ;
1505
+ deserialize_number ! ( deserialize_i128, do_deserialize_i128) ;
1506
+ deserialize_number ! ( deserialize_u128, do_deserialize_u128) ;
1498
1507
1499
1508
fn deserialize_char < V > ( self , visitor : V ) -> Result < V :: Value >
1500
1509
where
0 commit comments