@@ -1926,31 +1926,41 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1926
1926
where
1927
1927
T : de:: DeserializeSeed < ' de > ,
1928
1928
{
1929
- let peek = match tri ! ( self . de. parse_whitespace( ) ) {
1930
- Some ( b']' ) => {
1931
- return Ok ( None ) ;
1932
- }
1933
- Some ( b',' ) if !self . first => {
1934
- self . de . eat_char ( ) ;
1935
- tri ! ( self . de. parse_whitespace( ) )
1936
- }
1937
- Some ( b) => {
1938
- if self . first {
1939
- self . first = false ;
1940
- Some ( b)
1941
- } else {
1942
- return Err ( self . de . peek_error ( ErrorCode :: ExpectedListCommaOrEnd ) ) ;
1929
+ fn has_next_element < ' de , ' a , R : Read < ' de > + ' a > (
1930
+ seq : & mut SeqAccess < ' a , R > ,
1931
+ ) -> Result < bool > {
1932
+ let peek = match tri ! ( seq. de. parse_whitespace( ) ) {
1933
+ Some ( b']' ) => {
1934
+ return Ok ( false ) ;
1943
1935
}
1936
+ Some ( b',' ) if !seq. first => {
1937
+ seq. de . eat_char ( ) ;
1938
+ tri ! ( seq. de. parse_whitespace( ) )
1939
+ }
1940
+ Some ( b) => {
1941
+ if seq. first {
1942
+ seq. first = false ;
1943
+ Some ( b)
1944
+ } else {
1945
+ return Err ( seq. de . peek_error ( ErrorCode :: ExpectedListCommaOrEnd ) ) ;
1946
+ }
1947
+ }
1948
+ None => {
1949
+ return Err ( seq. de . peek_error ( ErrorCode :: EofWhileParsingList ) ) ;
1950
+ }
1951
+ } ;
1952
+
1953
+ match peek {
1954
+ Some ( b']' ) => Err ( seq. de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1955
+ Some ( _) => Ok ( true ) ,
1956
+ None => Err ( seq. de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1944
1957
}
1945
- None => {
1946
- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingList ) ) ;
1947
- }
1948
- } ;
1958
+ }
1949
1959
1950
- match peek {
1951
- Some ( b']' ) => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
1952
- Some ( _ ) => Ok ( Some ( tri ! ( seed . deserialize ( & mut * self . de ) ) ) ) ,
1953
- None => Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1960
+ if tri ! ( has_next_element ( self ) ) {
1961
+ Ok ( Some ( tri ! ( seed . deserialize ( & mut * self . de) ) ) )
1962
+ } else {
1963
+ Ok ( None )
1954
1964
}
1955
1965
}
1956
1966
}
@@ -1973,32 +1983,40 @@ impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1973
1983
where
1974
1984
K : de:: DeserializeSeed < ' de > ,
1975
1985
{
1976
- let peek = match tri ! ( self . de. parse_whitespace( ) ) {
1977
- Some ( b'}' ) => {
1978
- return Ok ( None ) ;
1979
- }
1980
- Some ( b',' ) if !self . first => {
1981
- self . de . eat_char ( ) ;
1982
- tri ! ( self . de. parse_whitespace( ) )
1983
- }
1984
- Some ( b) => {
1985
- if self . first {
1986
- self . first = false ;
1987
- Some ( b)
1988
- } else {
1989
- return Err ( self . de . peek_error ( ErrorCode :: ExpectedObjectCommaOrEnd ) ) ;
1986
+ fn has_next_key < ' de , ' a , R : Read < ' de > + ' a > ( map : & mut MapAccess < ' a , R > ) -> Result < bool > {
1987
+ let peek = match tri ! ( map. de. parse_whitespace( ) ) {
1988
+ Some ( b'}' ) => {
1989
+ return Ok ( false ) ;
1990
1990
}
1991
+ Some ( b',' ) if !map. first => {
1992
+ map. de . eat_char ( ) ;
1993
+ tri ! ( map. de. parse_whitespace( ) )
1994
+ }
1995
+ Some ( b) => {
1996
+ if map. first {
1997
+ map. first = false ;
1998
+ Some ( b)
1999
+ } else {
2000
+ return Err ( map. de . peek_error ( ErrorCode :: ExpectedObjectCommaOrEnd ) ) ;
2001
+ }
2002
+ }
2003
+ None => {
2004
+ return Err ( map. de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
2005
+ }
2006
+ } ;
2007
+
2008
+ match peek {
2009
+ Some ( b'"' ) => Ok ( true ) ,
2010
+ Some ( b'}' ) => Err ( map. de . peek_error ( ErrorCode :: TrailingComma ) ) ,
2011
+ Some ( _) => Err ( map. de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
2012
+ None => Err ( map. de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
1991
2013
}
1992
- None => {
1993
- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
1994
- }
1995
- } ;
2014
+ }
1996
2015
1997
- match peek {
1998
- Some ( b'"' ) => seed. deserialize ( MapKey { de : & mut * self . de } ) . map ( Some ) ,
1999
- Some ( b'}' ) => Err ( self . de . peek_error ( ErrorCode :: TrailingComma ) ) ,
2000
- Some ( _) => Err ( self . de . peek_error ( ErrorCode :: KeyMustBeAString ) ) ,
2001
- None => Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingValue ) ) ,
2016
+ if tri ! ( has_next_key( self ) ) {
2017
+ Ok ( Some ( tri ! ( seed. deserialize( MapKey { de: & mut * self . de } ) ) ) )
2018
+ } else {
2019
+ Ok ( None )
2002
2020
}
2003
2021
}
2004
2022
0 commit comments