@@ -1926,31 +1926,41 @@ impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
19261926 where
19271927 T : de:: DeserializeSeed < ' de > ,
19281928 {
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 ) ;
19431935 }
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 ) ) ,
19441957 }
1945- None => {
1946- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingList ) ) ;
1947- }
1948- } ;
1958+ }
19491959
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 )
19541964 }
19551965 }
19561966}
@@ -1973,32 +1983,40 @@ impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
19731983 where
19741984 K : de:: DeserializeSeed < ' de > ,
19751985 {
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 ) ;
19901990 }
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 ) ) ,
19912013 }
1992- None => {
1993- return Err ( self . de . peek_error ( ErrorCode :: EofWhileParsingObject ) ) ;
1994- }
1995- } ;
2014+ }
19962015
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 )
20022020 }
20032021 }
20042022
0 commit comments