@@ -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,15 +1419,12 @@ 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'-' ) => {
1422
+ match tri!( self . parse_whitespace_in_value ( ) ) {
1423
+ b'-' => {
1430
1424
self . eat_char( ) ;
1431
1425
buf. push( '-' ) ;
1432
1426
}
1433
- Some ( _) => { }
1434
- None => {
1435
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1436
- }
1427
+ _ => { }
1437
1428
} ;
1438
1429
1439
1430
tri!( self . scan_integer128( & mut buf) ) ;
@@ -1455,14 +1446,11 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1455
1446
where
1456
1447
V : de:: Visitor <' de>,
1457
1448
{
1458
- match tri!( self . parse_whitespace ( ) ) {
1459
- Some ( b'-' ) => {
1449
+ match tri!( self . parse_whitespace_in_value ( ) ) {
1450
+ b'-' => {
1460
1451
return Err ( self . peek_error( ErrorCode :: NumberOutOfRange ) ) ;
1461
1452
}
1462
- Some ( _) => { }
1463
- None => {
1464
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1465
- }
1453
+ _ => { }
1466
1454
}
1467
1455
1468
1456
let mut buf = String :: new( ) ;
@@ -1493,12 +1481,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1493
1481
where
1494
1482
V : de:: Visitor < ' de > ,
1495
1483
{
1496
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1497
- Some ( b) => b,
1498
- None => {
1499
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1500
- }
1501
- } ;
1484
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1502
1485
1503
1486
let value = match peek {
1504
1487
b'"' => {
@@ -1600,12 +1583,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1600
1583
where
1601
1584
V : de:: Visitor < ' de > ,
1602
1585
{
1603
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1604
- Some ( b) => b,
1605
- None => {
1606
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1607
- }
1608
- } ;
1586
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1609
1587
1610
1588
let value = match peek {
1611
1589
b'"' => {
@@ -1654,12 +1632,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1654
1632
where
1655
1633
V : de:: Visitor < ' de > ,
1656
1634
{
1657
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1658
- Some ( b) => b,
1659
- None => {
1660
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1661
- }
1662
- } ;
1635
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1663
1636
1664
1637
let value = match peek {
1665
1638
b'n' => {
@@ -1704,12 +1677,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1704
1677
where
1705
1678
V : de:: Visitor < ' de > ,
1706
1679
{
1707
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1708
- Some ( b) => b,
1709
- None => {
1710
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1711
- }
1712
- } ;
1680
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1713
1681
1714
1682
let value = match peek {
1715
1683
b'[' => {
@@ -1755,12 +1723,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1755
1723
where
1756
1724
V : de:: Visitor < ' de > ,
1757
1725
{
1758
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1759
- Some ( b) => b,
1760
- None => {
1761
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1762
- }
1763
- } ;
1726
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1764
1727
1765
1728
let value = match peek {
1766
1729
b'{' => {
@@ -1792,12 +1755,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1792
1755
where
1793
1756
V : de:: Visitor < ' de > ,
1794
1757
{
1795
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1796
- Some ( b) => b,
1797
- None => {
1798
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1799
- }
1800
- } ;
1758
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1801
1759
1802
1760
let value = match peek {
1803
1761
b'[' => {
@@ -1843,25 +1801,23 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1843
1801
where
1844
1802
V : de:: Visitor < ' de > ,
1845
1803
{
1846
- match tri ! ( self . parse_whitespace ( ) ) {
1847
- Some ( b'{' ) => {
1804
+ match tri ! ( self . parse_whitespace_in_value ( ) ) {
1805
+ b'{' => {
1848
1806
check_recursion ! {
1849
1807
self . eat_char( ) ;
1850
1808
let value = tri!( visitor. visit_enum( VariantAccess :: new( self ) ) ) ;
1851
1809
}
1852
1810
1853
- match tri ! ( self . parse_whitespace ( ) ) {
1854
- Some ( b'}' ) => {
1811
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
1812
+ b'}' => {
1855
1813
self . eat_char ( ) ;
1856
1814
Ok ( value)
1857
1815
}
1858
- Some ( _) => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1859
- None => Err ( self . error ( ErrorCode :: EofWhileParsingObject ) ) ,
1816
+ _ => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1860
1817
}
1861
1818
}
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 ) ) ,
1819
+ b'"' => visitor. visit_enum ( UnitVariantAccess :: new ( self ) ) ,
1820
+ _ => Err ( self . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ,
1865
1821
}
1866
1822
}
1867
1823
@@ -1905,12 +1861,12 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1905
1861
}
1906
1862
Some ( b',' ) if !self . first => {
1907
1863
self . de . eat_char ( ) ;
1908
- tri ! ( self . de. parse_whitespace ( ) )
1864
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1909
1865
}
1910
1866
Some ( b) => {
1911
1867
if self . first {
1912
1868
self . first = false ;
1913
- Some ( b )
1869
+ b
1914
1870
} else {
1915
1871
return Err ( self . de . peek_error ( ErrorCode :: ExpectedListCommaOrEnd ) ) ;
1916
1872
}
@@ -1921,9 +1877,8 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1921
1877
} ;
1922
1878
1923
1879
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 ) ) ,
1880
+ b']' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1881
+ _ => Ok ( Some ( tri ! ( seed. deserialize( & mut * self . de) ) ) ) ,
1927
1882
}
1928
1883
}
1929
1884
}
@@ -1946,32 +1901,28 @@ impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1946
1901
where
1947
1902
K : de:: DeserializeSeed < ' de > ,
1948
1903
{
1949
- let peek = match tri ! ( self . de. parse_whitespace ( ) ) {
1950
- Some ( b'}' ) => {
1904
+ let peek = match tri ! ( self . de. parse_whitespace_in_object ( ) ) {
1905
+ b'}' => {
1951
1906
return Ok ( None ) ;
1952
1907
}
1953
- Some ( b',' ) if !self . first => {
1908
+ b',' if !self . first => {
1954
1909
self . de . eat_char ( ) ;
1955
- tri ! ( self . de. parse_whitespace ( ) )
1910
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1956
1911
}
1957
- Some ( b ) => {
1912
+ b => {
1958
1913
if self . first {
1959
1914
self . first = false ;
1960
- Some ( b )
1915
+ b
1961
1916
} else {
1962
1917
return Err ( self . de . peek_error ( ErrorCode :: ExpectedObjectCommaOrEnd ) ) ;
1963
1918
}
1964
1919
}
1965
- None => {
1966
- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
1967
- }
1968
1920
} ;
1969
1921
1970
1922
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 ) ) ,
1923
+ b'"' => seed. deserialize ( MapKey { de : & mut * self . de } ) . map ( Some ) ,
1924
+ b'}' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1925
+ _ => Err ( self . de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1975
1926
}
1976
1927
}
1977
1928
0 commit comments