diff --git a/json.rs b/json.rs index d35ddd58..e3b98168 100644 --- a/json.rs +++ b/json.rs @@ -1164,6 +1164,7 @@ pub struct Parser { } impl> Iterator> for Parser { + #[inline] fn next(&mut self) -> Option> { let state = match self.state.pop() { Some(state) => state, @@ -1600,6 +1601,20 @@ impl> de::Deserializer for Parser { fn syntax_error(&self) -> ParserError { SyntaxError(InvalidSyntax, self.line, self.col) } + + // Special case treating options as a nullable value. + #[inline] + fn expect_option< + U: de::Deserializable> + >(&mut self, token: de::Token) -> Result, ParserError> { + match token { + de::Null => Ok(None), + token => { + let value: U = try!(de::Deserializable::deserialize_token(self, token)); + Ok(Some(value)) + } + } + } } /* @@ -2999,18 +3014,16 @@ mod tests { ); } - /* #[test] fn test_decode_option() { - let mut decoder = Decoder::new(from_str("null").unwrap()); - let value: Option = Decodable::decode(&mut decoder).unwrap(); - assert_eq!(value, None); + let value: Result, ParserError> = from_iter("null".chars()); + assert_eq!(value, Ok(None)); - let mut decoder = Decoder::new(from_str("\"jodhpurs\"").unwrap()); - let value: Option = Decodable::decode(&mut decoder).unwrap(); - assert_eq!(value, Some("jodhpurs".to_strbuf())); + let value: Result, ParserError> = from_iter("\"jodhpurs\"".chars()); + assert_eq!(value, Ok(Some("jodhpurs".to_strbuf()))); } + /* #[test] fn test_decode_enum() { let mut decoder = Decoder::new(from_str("\"Dog\"").unwrap());