@@ -234,6 +234,24 @@ impl<'de, R: Read<'de>> Deserializer<R> {
234
234
Error :: syntax ( reason, position. line , position. column )
235
235
}
236
236
237
+ /// Returns the first non-whitespace byte without consuming it, or `Err` if
238
+ /// EOF is encountered.
239
+ fn parse_whitespace_in_value ( & mut self ) -> Result < u8 > {
240
+ match tri ! ( self . parse_whitespace( ) ) {
241
+ Some ( b) => Ok ( b) ,
242
+ None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
243
+ }
244
+ }
245
+
246
+ /// Returns the first non-whitespace byte without consuming it, or `Err` if
247
+ /// EOF is encountered.
248
+ fn parse_whitespace_in_object ( & mut self ) -> Result < u8 > {
249
+ match tri ! ( self . parse_whitespace( ) ) {
250
+ Some ( b) => Ok ( b) ,
251
+ None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
252
+ }
253
+ }
254
+
237
255
/// Returns the first non-whitespace byte without consuming it, or `None` if
238
256
/// EOF is encountered.
239
257
fn parse_whitespace ( & mut self ) -> Result < Option < u8 > > {
@@ -304,12 +322,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
304
322
where
305
323
V : de:: Visitor < ' de > ,
306
324
{
307
- let peek = match tri ! ( self . parse_whitespace( ) ) {
308
- Some ( b) => b,
309
- None => {
310
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
311
- }
312
- } ;
325
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
313
326
314
327
let value = match peek {
315
328
b'-' => {
@@ -961,13 +974,12 @@ impl<'de, R: Read<'de>> Deserializer<R> {
961
974
}
962
975
963
976
fn parse_object_colon ( & mut self ) -> Result < ( ) > {
964
- match tri ! ( self . parse_whitespace ( ) ) {
965
- Some ( b':' ) => {
977
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
978
+ b':' => {
966
979
self . eat_char ( ) ;
967
980
Ok ( ( ) )
968
981
}
969
- Some ( _) => Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
970
- None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
982
+ _ => Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
971
983
}
972
984
}
973
985
@@ -990,14 +1002,13 @@ impl<'de, R: Read<'de>> Deserializer<R> {
990
1002
}
991
1003
992
1004
fn end_map ( & mut self ) -> Result < ( ) > {
993
- match tri ! ( self . parse_whitespace ( ) ) {
994
- Some ( b'}' ) => {
1005
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
1006
+ b'}' => {
995
1007
self . eat_char ( ) ;
996
1008
Ok ( ( ) )
997
1009
}
998
- Some ( b',' ) => Err ( self . peek_error ( ErrorCode :: TrailingComma ) ) ,
999
- Some ( _) => Err ( self . peek_error ( ErrorCode :: TrailingCharacters ) ) ,
1000
- None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
1010
+ b',' => Err ( self . peek_error ( ErrorCode :: TrailingComma ) ) ,
1011
+ _ => Err ( self . peek_error ( ErrorCode :: TrailingCharacters ) ) ,
1001
1012
}
1002
1013
}
1003
1014
@@ -1006,12 +1017,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
1006
1017
let mut enclosing = None ;
1007
1018
1008
1019
loop {
1009
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1010
- Some ( b) => b,
1011
- None => {
1012
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1013
- }
1014
- } ;
1020
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1015
1021
1016
1022
let frame = match peek {
1017
1023
b'n' => {
@@ -1099,16 +1105,14 @@ impl<'de, R: Read<'de>> Deserializer<R> {
1099
1105
}
1100
1106
1101
1107
if frame == b'{' {
1102
- match tri ! ( self . parse_whitespace( ) ) {
1103
- Some ( b'"' ) => self . eat_char ( ) ,
1104
- Some ( _) => return Err ( self . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1105
- None => return Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
1108
+ match tri ! ( self . parse_whitespace_in_object( ) ) {
1109
+ b'"' => self . eat_char ( ) ,
1110
+ _ => return Err ( self . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1106
1111
}
1107
1112
tri ! ( self . read. ignore_str( ) ) ;
1108
- match tri ! ( self . parse_whitespace( ) ) {
1109
- Some ( b':' ) => self . eat_char ( ) ,
1110
- Some ( _) => return Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
1111
- None => return Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
1113
+ match tri ! ( self . parse_whitespace_in_object( ) ) {
1114
+ b':' => self . eat_char ( ) ,
1115
+ _ => return Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
1112
1116
}
1113
1117
}
1114
1118
@@ -1292,12 +1296,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1292
1296
where
1293
1297
V : de:: Visitor < ' de > ,
1294
1298
{
1295
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1296
- Some ( b) => b,
1297
- None => {
1298
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1299
- }
1300
- } ;
1299
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1301
1300
1302
1301
let value = match peek {
1303
1302
b'n' => {
@@ -1368,12 +1367,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1368
1367
where
1369
1368
V : de:: Visitor < ' de > ,
1370
1369
{
1371
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1372
- Some ( b) => b,
1373
- None => {
1374
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1375
- }
1376
- } ;
1370
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1377
1371
1378
1372
let value = match peek {
1379
1373
b't' => {
@@ -1425,16 +1419,10 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1425
1419
{
1426
1420
let mut buf = String :: new( ) ;
1427
1421
1428
- match tri!( self . parse_whitespace( ) ) {
1429
- Some ( b'-' ) => {
1430
- self . eat_char( ) ;
1431
- buf. push( '-' ) ;
1432
- }
1433
- Some ( _) => { }
1434
- None => {
1435
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1436
- }
1437
- } ;
1422
+ if tri!( self . parse_whitespace_in_value( ) ) == b'-' {
1423
+ self . eat_char( ) ;
1424
+ buf. push( '-' ) ;
1425
+ }
1438
1426
1439
1427
tri!( self . scan_integer128( & mut buf) ) ;
1440
1428
@@ -1455,14 +1443,8 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1455
1443
where
1456
1444
V : de:: Visitor <' de>,
1457
1445
{
1458
- match tri!( self . parse_whitespace( ) ) {
1459
- Some ( b'-' ) => {
1460
- return Err ( self . peek_error( ErrorCode :: NumberOutOfRange ) ) ;
1461
- }
1462
- Some ( _) => { }
1463
- None => {
1464
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1465
- }
1446
+ if tri!( self . parse_whitespace_in_value( ) ) == b'-' {
1447
+ return Err ( self . peek_error( ErrorCode :: NumberOutOfRange ) ) ;
1466
1448
}
1467
1449
1468
1450
let mut buf = String :: new( ) ;
@@ -1493,12 +1475,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1493
1475
where
1494
1476
V : de:: Visitor < ' de > ,
1495
1477
{
1496
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1497
- Some ( b) => b,
1498
- None => {
1499
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1500
- }
1501
- } ;
1478
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1502
1479
1503
1480
let value = match peek {
1504
1481
b'"' => {
@@ -1600,12 +1577,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1600
1577
where
1601
1578
V : de:: Visitor < ' de > ,
1602
1579
{
1603
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1604
- Some ( b) => b,
1605
- None => {
1606
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1607
- }
1608
- } ;
1580
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1609
1581
1610
1582
let value = match peek {
1611
1583
b'"' => {
@@ -1654,12 +1626,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1654
1626
where
1655
1627
V : de:: Visitor < ' de > ,
1656
1628
{
1657
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1658
- Some ( b) => b,
1659
- None => {
1660
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1661
- }
1662
- } ;
1629
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1663
1630
1664
1631
let value = match peek {
1665
1632
b'n' => {
@@ -1704,12 +1671,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1704
1671
where
1705
1672
V : de:: Visitor < ' de > ,
1706
1673
{
1707
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1708
- Some ( b) => b,
1709
- None => {
1710
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1711
- }
1712
- } ;
1674
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1713
1675
1714
1676
let value = match peek {
1715
1677
b'[' => {
@@ -1755,12 +1717,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1755
1717
where
1756
1718
V : de:: Visitor < ' de > ,
1757
1719
{
1758
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1759
- Some ( b) => b,
1760
- None => {
1761
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1762
- }
1763
- } ;
1720
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1764
1721
1765
1722
let value = match peek {
1766
1723
b'{' => {
@@ -1792,12 +1749,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1792
1749
where
1793
1750
V : de:: Visitor < ' de > ,
1794
1751
{
1795
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1796
- Some ( b) => b,
1797
- None => {
1798
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1799
- }
1800
- } ;
1752
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1801
1753
1802
1754
let value = match peek {
1803
1755
b'[' => {
@@ -1843,25 +1795,23 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1843
1795
where
1844
1796
V : de:: Visitor < ' de > ,
1845
1797
{
1846
- match tri ! ( self . parse_whitespace ( ) ) {
1847
- Some ( b'{' ) => {
1798
+ match tri ! ( self . parse_whitespace_in_value ( ) ) {
1799
+ b'{' => {
1848
1800
check_recursion ! {
1849
1801
self . eat_char( ) ;
1850
1802
let value = tri!( visitor. visit_enum( VariantAccess :: new( self ) ) ) ;
1851
1803
}
1852
1804
1853
- match tri ! ( self . parse_whitespace ( ) ) {
1854
- Some ( b'}' ) => {
1805
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
1806
+ b'}' => {
1855
1807
self . eat_char ( ) ;
1856
1808
Ok ( value)
1857
1809
}
1858
- Some ( _) => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1859
- None => Err ( self . error ( ErrorCode :: EofWhileParsingObject ) ) ,
1810
+ _ => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1860
1811
}
1861
1812
}
1862
- Some ( b'"' ) => visitor. visit_enum ( UnitVariantAccess :: new ( self ) ) ,
1863
- Some ( _) => Err ( self . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ,
1864
- None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1813
+ b'"' => visitor. visit_enum ( UnitVariantAccess :: new ( self ) ) ,
1814
+ _ => Err ( self . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ,
1865
1815
}
1866
1816
}
1867
1817
@@ -1905,12 +1855,12 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1905
1855
}
1906
1856
Some ( b',' ) if !self . first => {
1907
1857
self . de . eat_char ( ) ;
1908
- tri ! ( self . de. parse_whitespace ( ) )
1858
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1909
1859
}
1910
1860
Some ( b) => {
1911
1861
if self . first {
1912
1862
self . first = false ;
1913
- Some ( b )
1863
+ b
1914
1864
} else {
1915
1865
return Err ( self . de . peek_error ( ErrorCode :: ExpectedListCommaOrEnd ) ) ;
1916
1866
}
@@ -1921,9 +1871,8 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1921
1871
} ;
1922
1872
1923
1873
match peek {
1924
- Some ( b']' ) => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1925
- Some ( _) => Ok ( Some ( tri ! ( seed. deserialize( & mut * self . de) ) ) ) ,
1926
- None => Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1874
+ b']' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1875
+ _ => Ok ( Some ( tri ! ( seed. deserialize( & mut * self . de) ) ) ) ,
1927
1876
}
1928
1877
}
1929
1878
}
@@ -1946,32 +1895,28 @@ impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1946
1895
where
1947
1896
K : de:: DeserializeSeed < ' de > ,
1948
1897
{
1949
- let peek = match tri ! ( self . de. parse_whitespace ( ) ) {
1950
- Some ( b'}' ) => {
1898
+ let peek = match tri ! ( self . de. parse_whitespace_in_object ( ) ) {
1899
+ b'}' => {
1951
1900
return Ok ( None ) ;
1952
1901
}
1953
- Some ( b',' ) if !self . first => {
1902
+ b',' if !self . first => {
1954
1903
self . de . eat_char ( ) ;
1955
- tri ! ( self . de. parse_whitespace ( ) )
1904
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1956
1905
}
1957
- Some ( b ) => {
1906
+ b => {
1958
1907
if self . first {
1959
1908
self . first = false ;
1960
- Some ( b )
1909
+ b
1961
1910
} else {
1962
1911
return Err ( self . de . peek_error ( ErrorCode :: ExpectedObjectCommaOrEnd ) ) ;
1963
1912
}
1964
1913
}
1965
- None => {
1966
- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
1967
- }
1968
1914
} ;
1969
1915
1970
1916
match peek {
1971
- Some ( b'"' ) => seed. deserialize ( MapKey { de : & mut * self . de } ) . map ( Some ) ,
1972
- Some ( b'}' ) => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1973
- Some ( _) => Err ( self . de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1974
- None => Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1917
+ b'"' => seed. deserialize ( MapKey { de : & mut * self . de } ) . map ( Some ) ,
1918
+ b'}' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1919
+ _ => Err ( self . de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1975
1920
}
1976
1921
}
1977
1922
0 commit comments