Reorder checks so most common conditional is first.
diff --git a/src/de.rs b/src/de.rs
index a9a61bb..1dfee28 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -1680,26 +1680,30 @@
T: de::DeserializeSeed<'de>,
{
match try!(self.de.parse_whitespace()) {
- Some(b']') => Ok(None),
- Some(_) => {
- let result = Ok(Some(try!(seed.deserialize(&mut *self.de))));
- if !result.is_ok() {
- return result;
- }
+ Some(b) => {
+ // List most common branch first.
+ if b != b']' {
+ let result = Ok(Some(try!(seed.deserialize(&mut *self.de))));
+ if !result.is_ok() {
+ return result;
+ }
- match try!(self.de.parse_whitespace()) {
- Some(b',') => self.de.eat_char(),
- Some(b']') => {
- // Ignore.
+ match try!(self.de.parse_whitespace()) {
+ Some(b',') => self.de.eat_char(),
+ Some(b']') => {
+ // Ignore.
+ }
+ Some(_) => {
+ return Err(self.de.peek_error(ErrorCode::ExpectedListCommaOrEnd));
+ }
+ None => {
+ return Err(self.de.peek_error(ErrorCode::EofWhileParsingList));
+ }
}
- Some(_) => {
- return Err(self.de.peek_error(ErrorCode::ExpectedListCommaOrEnd));
- }
- None => {
- return Err(self.de.peek_error(ErrorCode::EofWhileParsingList));
- }
+ result
+ } else {
+ Ok(None)
}
- result
}
None => Err(self.de.peek_error(ErrorCode::EofWhileParsingList)),
}
@@ -1724,10 +1728,10 @@
K: de::DeserializeSeed<'de>,
{
match try!(self.de.parse_whitespace()) {
+ Some(b'"') => seed.deserialize(MapKey { de: &mut *self.de }).map(Some),
Some(b'}') => {
return Ok(None);
}
- Some(b'"') => seed.deserialize(MapKey { de: &mut *self.de }).map(Some),
Some(_) => Err(self.de.peek_error(ErrorCode::KeyMustBeAString)),
None => Err(self.de.peek_error(ErrorCode::EofWhileParsingObject)),
}
@@ -1739,20 +1743,19 @@
{
try!(self.de.parse_object_colon());
let result = seed.deserialize(&mut *self.de);
- if !result.is_ok() {
- return result;
- }
- match try!(self.de.parse_whitespace()) {
- Some(b',') => self.de.eat_char(),
- Some(b'}') => {
- // Ignore.
- }
- Some(_) => {
- return Err(self.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd));
- }
- None => {
- return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject));
- }
+ if result.is_ok() {
+ match try!(self.de.parse_whitespace()) {
+ Some(b',') => self.de.eat_char(),
+ Some(b'}') => {
+ // Ignore.
+ }
+ Some(_) => {
+ return Err(self.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd));
+ }
+ None => {
+ return Err(self.de.peek_error(ErrorCode::EofWhileParsingObject));
+ }
+ };
};
result
}