Skip to content

Commit 4cb90ce

Browse files
authored
Merge pull request #1205 from dtolnay/hasnext
Reduce duplicative instantiation of logic in SeqAccess and MapAccess
2 parents a810ba9 + b71ccd2 commit 4cb90ce

File tree

1 file changed

+63
-45
lines changed

1 file changed

+63
-45
lines changed

src/de.rs

+63-45
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)