@@ -234,6 +234,28 @@ 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 => {
243
+ return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
244
+ }
245
+ }
246
+ }
247
+
248
+ /// Returns the first non-whitespace byte without consuming it, or `Err` if
249
+ /// EOF is encountered.
250
+ fn parse_whitespace_in_object ( & mut self ) -> Result < u8 > {
251
+ match tri ! ( self . parse_whitespace( ) ) {
252
+ Some ( b) => Ok ( b) ,
253
+ None => {
254
+ return Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
255
+ }
256
+ }
257
+ }
258
+
237
259
/// Returns the first non-whitespace byte without consuming it, or `None` if
238
260
/// EOF is encountered.
239
261
fn parse_whitespace ( & mut self ) -> Result < Option < u8 > > {
@@ -304,12 +326,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
304
326
where
305
327
V : de:: Visitor < ' de > ,
306
328
{
307
- let peek = match tri ! ( self . parse_whitespace( ) ) {
308
- Some ( b) => b,
309
- None => {
310
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
311
- }
312
- } ;
329
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
313
330
314
331
let value = match peek {
315
332
b'-' => {
@@ -961,13 +978,12 @@ impl<'de, R: Read<'de>> Deserializer<R> {
961
978
}
962
979
963
980
fn parse_object_colon ( & mut self ) -> Result < ( ) > {
964
- match tri ! ( self . parse_whitespace ( ) ) {
965
- Some ( b':' ) => {
981
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
982
+ b':' => {
966
983
self . eat_char ( ) ;
967
984
Ok ( ( ) )
968
985
}
969
- Some ( _) => Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
970
- None => Err ( self . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ,
986
+ _ => Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
971
987
}
972
988
}
973
989
@@ -990,14 +1006,13 @@ impl<'de, R: Read<'de>> Deserializer<R> {
990
1006
}
991
1007
992
1008
fn end_map ( & mut self ) -> Result < ( ) > {
993
- match tri ! ( self . parse_whitespace ( ) ) {
994
- Some ( b'}' ) => {
1009
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
1010
+ b'}' => {
995
1011
self . eat_char ( ) ;
996
1012
Ok ( ( ) )
997
1013
}
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 ) ) ,
1014
+ b',' => Err ( self . peek_error ( ErrorCode :: TrailingComma ) ) ,
1015
+ _ => Err ( self . peek_error ( ErrorCode :: TrailingCharacters ) ) ,
1001
1016
}
1002
1017
}
1003
1018
@@ -1006,12 +1021,7 @@ impl<'de, R: Read<'de>> Deserializer<R> {
1006
1021
let mut enclosing = None ;
1007
1022
1008
1023
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
- } ;
1024
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1015
1025
1016
1026
let frame = match peek {
1017
1027
b'n' => {
@@ -1099,16 +1109,14 @@ impl<'de, R: Read<'de>> Deserializer<R> {
1099
1109
}
1100
1110
1101
1111
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 ) ) ,
1112
+ match tri ! ( self . parse_whitespace_in_object( ) ) {
1113
+ b'"' => self . eat_char ( ) ,
1114
+ _ => return Err ( self . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1106
1115
}
1107
1116
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 ) ) ,
1117
+ match tri ! ( self . parse_whitespace_in_object( ) ) {
1118
+ b':' => self . eat_char ( ) ,
1119
+ _ => return Err ( self . peek_error ( ErrorCode :: ExpectedColon ) ) ,
1112
1120
}
1113
1121
}
1114
1122
@@ -1292,12 +1300,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1292
1300
where
1293
1301
V : de:: Visitor < ' de > ,
1294
1302
{
1295
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1296
- Some ( b) => b,
1297
- None => {
1298
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1299
- }
1300
- } ;
1303
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1301
1304
1302
1305
let value = match peek {
1303
1306
b'n' => {
@@ -1368,12 +1371,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1368
1371
where
1369
1372
V : de:: Visitor < ' de > ,
1370
1373
{
1371
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1372
- Some ( b) => b,
1373
- None => {
1374
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1375
- }
1376
- } ;
1374
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1377
1375
1378
1376
let value = match peek {
1379
1377
b't' => {
@@ -1425,15 +1423,12 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1425
1423
{
1426
1424
let mut buf = String :: new( ) ;
1427
1425
1428
- match tri!( self . parse_whitespace ( ) ) {
1429
- Some ( b'-' ) => {
1426
+ match tri!( self . parse_whitespace_in_value ( ) ) {
1427
+ b'-' => {
1430
1428
self . eat_char( ) ;
1431
1429
buf. push( '-' ) ;
1432
1430
}
1433
- Some ( _) => { }
1434
- None => {
1435
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1436
- }
1431
+ _ => { }
1437
1432
} ;
1438
1433
1439
1434
tri!( self . scan_integer128( & mut buf) ) ;
@@ -1455,14 +1450,11 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1455
1450
where
1456
1451
V : de:: Visitor <' de>,
1457
1452
{
1458
- match tri!( self . parse_whitespace ( ) ) {
1459
- Some ( b'-' ) => {
1453
+ match tri!( self . parse_whitespace_in_value ( ) ) {
1454
+ b'-' => {
1460
1455
return Err ( self . peek_error( ErrorCode :: NumberOutOfRange ) ) ;
1461
1456
}
1462
- Some ( _) => { }
1463
- None => {
1464
- return Err ( self . peek_error( ErrorCode :: EofWhileParsingValue ) ) ;
1465
- }
1457
+ _ => { }
1466
1458
}
1467
1459
1468
1460
let mut buf = String :: new( ) ;
@@ -1493,12 +1485,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1493
1485
where
1494
1486
V : de:: Visitor < ' de > ,
1495
1487
{
1496
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1497
- Some ( b) => b,
1498
- None => {
1499
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1500
- }
1501
- } ;
1488
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1502
1489
1503
1490
let value = match peek {
1504
1491
b'"' => {
@@ -1600,12 +1587,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1600
1587
where
1601
1588
V : de:: Visitor < ' de > ,
1602
1589
{
1603
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1604
- Some ( b) => b,
1605
- None => {
1606
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1607
- }
1608
- } ;
1590
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1609
1591
1610
1592
let value = match peek {
1611
1593
b'"' => {
@@ -1654,12 +1636,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1654
1636
where
1655
1637
V : de:: Visitor < ' de > ,
1656
1638
{
1657
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1658
- Some ( b) => b,
1659
- None => {
1660
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1661
- }
1662
- } ;
1639
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1663
1640
1664
1641
let value = match peek {
1665
1642
b'n' => {
@@ -1704,12 +1681,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1704
1681
where
1705
1682
V : de:: Visitor < ' de > ,
1706
1683
{
1707
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1708
- Some ( b) => b,
1709
- None => {
1710
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1711
- }
1712
- } ;
1684
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1713
1685
1714
1686
let value = match peek {
1715
1687
b'[' => {
@@ -1755,12 +1727,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1755
1727
where
1756
1728
V : de:: Visitor < ' de > ,
1757
1729
{
1758
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1759
- Some ( b) => b,
1760
- None => {
1761
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1762
- }
1763
- } ;
1730
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1764
1731
1765
1732
let value = match peek {
1766
1733
b'{' => {
@@ -1792,12 +1759,7 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1792
1759
where
1793
1760
V : de:: Visitor < ' de > ,
1794
1761
{
1795
- let peek = match tri ! ( self . parse_whitespace( ) ) {
1796
- Some ( b) => b,
1797
- None => {
1798
- return Err ( self . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ;
1799
- }
1800
- } ;
1762
+ let peek = tri ! ( self . parse_whitespace_in_value( ) ) ;
1801
1763
1802
1764
let value = match peek {
1803
1765
b'[' => {
@@ -1843,25 +1805,23 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer<R> {
1843
1805
where
1844
1806
V : de:: Visitor < ' de > ,
1845
1807
{
1846
- match tri ! ( self . parse_whitespace ( ) ) {
1847
- Some ( b'{' ) => {
1808
+ match tri ! ( self . parse_whitespace_in_value ( ) ) {
1809
+ b'{' => {
1848
1810
check_recursion ! {
1849
1811
self . eat_char( ) ;
1850
1812
let value = tri!( visitor. visit_enum( VariantAccess :: new( self ) ) ) ;
1851
1813
}
1852
1814
1853
- match tri ! ( self . parse_whitespace ( ) ) {
1854
- Some ( b'}' ) => {
1815
+ match tri ! ( self . parse_whitespace_in_object ( ) ) {
1816
+ b'}' => {
1855
1817
self . eat_char ( ) ;
1856
1818
Ok ( value)
1857
1819
}
1858
- Some ( _) => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1859
- None => Err ( self . error ( ErrorCode :: EofWhileParsingObject ) ) ,
1820
+ _ => Err ( self . error ( ErrorCode :: ExpectedSomeValue ) ) ,
1860
1821
}
1861
1822
}
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 ) ) ,
1823
+ b'"' => visitor. visit_enum ( UnitVariantAccess :: new ( self ) ) ,
1824
+ _ => Err ( self . peek_error ( ErrorCode :: ExpectedSomeValue ) ) ,
1865
1825
}
1866
1826
}
1867
1827
@@ -1905,12 +1865,12 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1905
1865
}
1906
1866
Some ( b',' ) if !self . first => {
1907
1867
self . de . eat_char ( ) ;
1908
- tri ! ( self . de. parse_whitespace ( ) )
1868
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1909
1869
}
1910
1870
Some ( b) => {
1911
1871
if self . first {
1912
1872
self . first = false ;
1913
- Some ( b )
1873
+ b
1914
1874
} else {
1915
1875
return Err ( self . de . peek_error ( ErrorCode :: ExpectedListCommaOrEnd ) ) ;
1916
1876
}
@@ -1921,9 +1881,8 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1921
1881
} ;
1922
1882
1923
1883
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 ) ) ,
1884
+ b']' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1885
+ _ => Ok ( Some ( tri ! ( seed. deserialize( & mut * self . de) ) ) ) ,
1927
1886
}
1928
1887
}
1929
1888
}
@@ -1946,32 +1905,28 @@ impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1946
1905
where
1947
1906
K : de:: DeserializeSeed < ' de > ,
1948
1907
{
1949
- let peek = match tri ! ( self . de. parse_whitespace ( ) ) {
1950
- Some ( b'}' ) => {
1908
+ let peek = match tri ! ( self . de. parse_whitespace_in_object ( ) ) {
1909
+ b'}' => {
1951
1910
return Ok ( None ) ;
1952
1911
}
1953
- Some ( b',' ) if !self . first => {
1912
+ b',' if !self . first => {
1954
1913
self . de . eat_char ( ) ;
1955
- tri ! ( self . de. parse_whitespace ( ) )
1914
+ tri ! ( self . de. parse_whitespace_in_value ( ) )
1956
1915
}
1957
- Some ( b ) => {
1916
+ b => {
1958
1917
if self . first {
1959
1918
self . first = false ;
1960
- Some ( b )
1919
+ b
1961
1920
} else {
1962
1921
return Err ( self . de . peek_error ( ErrorCode :: ExpectedObjectCommaOrEnd ) ) ;
1963
1922
}
1964
1923
}
1965
- None => {
1966
- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
1967
- }
1968
1924
} ;
1969
1925
1970
1926
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 ) ) ,
1927
+ b'"' => seed. deserialize ( MapKey { de : & mut * self . de } ) . map ( Some ) ,
1928
+ b'}' => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1929
+ _ => Err ( self . de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
1975
1930
}
1976
1931
}
1977
1932
0 commit comments