From c9d55362d6de86c44a829d3e56aee290fbf06341 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Sat, 1 Aug 2015 13:49:57 -0700 Subject: [PATCH] Add a serde_json::Result helper type --- serde_json/src/de.rs | 68 ++++++++++++++++++++--------------------- serde_json/src/error.rs | 4 +++ serde_json/src/lib.rs | 2 +- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/serde_json/src/de.rs b/serde_json/src/de.rs index 31f406af..2f752287 100644 --- a/serde_json/src/de.rs +++ b/serde_json/src/de.rs @@ -6,7 +6,7 @@ use std::str; use serde::de; use serde::iter::LineColIterator; -use super::error::{Error, ErrorCode}; +use super::error::{Error, ErrorCode, Result}; pub struct Deserializer>> { rdr: LineColIterator, @@ -28,7 +28,7 @@ impl Deserializer { /// Creates the JSON parser from an `std::iter::Iterator`. #[inline] - pub fn new(rdr: Iter) -> Result, Error> { + pub fn new(rdr: Iter) -> Result> { let mut deserializer = Deserializer { rdr: LineColIterator::new(rdr), ch: None, @@ -41,7 +41,7 @@ impl Deserializer } #[inline] - pub fn end(&mut self) -> Result<(), Error> { + pub fn end(&mut self) -> Result<()> { try!(self.parse_whitespace()); if self.eof() { Ok(()) @@ -54,7 +54,7 @@ impl Deserializer fn ch_or_null(&self) -> u8 { self.ch.unwrap_or(b'\x00') } - fn bump(&mut self) -> Result<(), Error> { + fn bump(&mut self) -> Result<()> { self.ch = match self.rdr.next() { Some(Err(err)) => { return Err(Error::IoError(err)); } Some(Ok(ch)) => Some(ch), @@ -64,7 +64,7 @@ impl Deserializer Ok(()) } - fn next_char(&mut self) -> Result, Error> { + fn next_char(&mut self) -> Result> { try!(self.bump()); Ok(self.ch) } @@ -77,7 +77,7 @@ impl Deserializer Error::SyntaxError(reason, self.rdr.line(), self.rdr.col()) } - fn parse_whitespace(&mut self) -> Result<(), Error> { + fn parse_whitespace(&mut self) -> Result<()> { while self.ch_is(b' ') || self.ch_is(b'\n') || self.ch_is(b'\t') || @@ -86,7 +86,7 @@ impl Deserializer Ok(()) } - fn parse_value(&mut self, mut visitor: V) -> Result + fn parse_value(&mut self, mut visitor: V) -> Result where V: de::Visitor, { try!(self.parse_whitespace()); @@ -134,7 +134,7 @@ impl Deserializer } } - fn parse_ident(&mut self, ident: &[u8]) -> Result<(), Error> { + fn parse_ident(&mut self, ident: &[u8]) -> Result<()> { for c in ident { if Some(*c) != try!(self.next_char()) { return Err(self.error(ErrorCode::ExpectedSomeIdent)); @@ -145,7 +145,7 @@ impl Deserializer Ok(()) } - fn parse_number(&mut self, mut visitor: V) -> Result + fn parse_number(&mut self, mut visitor: V) -> Result where V: de::Visitor, { let mut neg = false; @@ -189,7 +189,7 @@ impl Deserializer } } - fn parse_integer(&mut self) -> Result { + fn parse_integer(&mut self) -> Result { let mut accum: u64 = 0; match self.ch_or_null() { @@ -223,7 +223,7 @@ impl Deserializer Ok(accum) } - fn parse_decimal(&mut self, res: f64) -> Result { + fn parse_decimal(&mut self, res: f64) -> Result { try!(self.bump()); // Make sure a digit follows the decimal place. @@ -248,7 +248,7 @@ impl Deserializer Ok(res) } - fn parse_exponent(&mut self, mut res: f64) -> Result { + fn parse_exponent(&mut self, mut res: f64) -> Result { try!(self.bump()); let mut exp: u64 = 0; @@ -293,7 +293,7 @@ impl Deserializer Ok(res) } - fn decode_hex_escape(&mut self) -> Result { + fn decode_hex_escape(&mut self) -> Result { let mut i = 0; let mut n = 0u16; while i < 4 && !self.eof() { @@ -320,7 +320,7 @@ impl Deserializer Ok(n) } - fn parse_string(&mut self) -> Result<(), Error> { + fn parse_string(&mut self) -> Result<()> { self.str_buf.clear(); loop { @@ -409,7 +409,7 @@ impl Deserializer } } - fn parse_object_colon(&mut self) -> Result<(), Error> { + fn parse_object_colon(&mut self) -> Result<()> { try!(self.parse_whitespace()); if self.ch_is(b':') { @@ -429,14 +429,14 @@ impl de::Deserializer for Deserializer type Error = Error; #[inline] - fn visit(&mut self, visitor: V) -> Result + fn visit(&mut self, visitor: V) -> Result where V: de::Visitor, { self.parse_value(visitor) } #[inline] - fn visit_option(&mut self, mut visitor: V) -> Result + fn visit_option(&mut self, mut visitor: V) -> Result where V: de::Visitor, { try!(self.parse_whitespace()); @@ -456,7 +456,7 @@ impl de::Deserializer for Deserializer #[inline] fn visit_newtype_struct(&mut self, _name: &str, - mut visitor: V) -> Result + mut visitor: V) -> Result where V: de::Visitor, { visitor.visit_newtype_struct(self) @@ -466,7 +466,7 @@ impl de::Deserializer for Deserializer fn visit_enum(&mut self, _name: &str, _variants: &'static [&'static str], - mut visitor: V) -> Result + mut visitor: V) -> Result where V: de::EnumVisitor, { try!(self.parse_whitespace()); @@ -517,7 +517,7 @@ impl<'a, Iter> de::SeqVisitor for SeqVisitor<'a, Iter> { type Error = Error; - fn visit(&mut self) -> Result, Error> + fn visit(&mut self) -> Result> where T: de::Deserialize, { try!(self.de.parse_whitespace()); @@ -542,7 +542,7 @@ impl<'a, Iter> de::SeqVisitor for SeqVisitor<'a, Iter> Ok(Some(value)) } - fn end(&mut self) -> Result<(), Error> { + fn end(&mut self) -> Result<()> { try!(self.de.parse_whitespace()); if self.de.ch_is(b']') { @@ -574,7 +574,7 @@ impl<'a, Iter> de::MapVisitor for MapVisitor<'a, Iter> { type Error = Error; - fn visit_key(&mut self) -> Result, Error> + fn visit_key(&mut self) -> Result> where K: de::Deserialize, { try!(self.de.parse_whitespace()); @@ -607,7 +607,7 @@ impl<'a, Iter> de::MapVisitor for MapVisitor<'a, Iter> Ok(Some(try!(de::Deserialize::deserialize(self.de)))) } - fn visit_value(&mut self) -> Result + fn visit_value(&mut self) -> Result where V: de::Deserialize, { try!(self.de.parse_object_colon()); @@ -615,7 +615,7 @@ impl<'a, Iter> de::MapVisitor for MapVisitor<'a, Iter> Ok(try!(de::Deserialize::deserialize(self.de))) } - fn end(&mut self) -> Result<(), Error> { + fn end(&mut self) -> Result<()> { try!(self.de.parse_whitespace()); if self.de.ch_is(b'}') { @@ -628,7 +628,7 @@ impl<'a, Iter> de::MapVisitor for MapVisitor<'a, Iter> } } - fn missing_field(&mut self, _field: &'static str) -> Result + fn missing_field(&mut self, _field: &'static str) -> Result where V: de::Deserialize, { let mut de = de::value::ValueDeserializer::into_deserializer(()); @@ -641,7 +641,7 @@ impl de::VariantVisitor for Deserializer { type Error = Error; - fn visit_variant(&mut self) -> Result + fn visit_variant(&mut self) -> Result where V: de::Deserialize { let val = try!(de::Deserialize::deserialize(self)); @@ -649,11 +649,11 @@ impl de::VariantVisitor for Deserializer Ok(val) } - fn visit_unit(&mut self) -> Result<(), Error> { + fn visit_unit(&mut self) -> Result<()> { de::Deserialize::deserialize(self) } - fn visit_newtype(&mut self) -> Result + fn visit_newtype(&mut self) -> Result where T: de::Deserialize, { de::Deserialize::deserialize(self) @@ -661,7 +661,7 @@ impl de::VariantVisitor for Deserializer fn visit_tuple(&mut self, _len: usize, - visitor: V) -> Result + visitor: V) -> Result where V: de::Visitor, { de::Deserializer::visit(self, visitor) @@ -669,7 +669,7 @@ impl de::VariantVisitor for Deserializer fn visit_struct(&mut self, _fields: &'static [&'static str], - visitor: V) -> Result + visitor: V) -> Result where V: de::Visitor, { de::Deserializer::visit(self, visitor) @@ -677,7 +677,7 @@ impl de::VariantVisitor for Deserializer } /// Decodes a json value from a `std::io::Read`. -pub fn from_iter(iter: I) -> Result +pub fn from_iter(iter: I) -> Result where I: Iterator>, T: de::Deserialize, { @@ -690,7 +690,7 @@ pub fn from_iter(iter: I) -> Result } /// Decodes a json value from a `std::io::Read`. -pub fn from_reader(rdr: R) -> Result +pub fn from_reader(rdr: R) -> Result where R: io::Read, T: de::Deserialize, { @@ -698,14 +698,14 @@ pub fn from_reader(rdr: R) -> Result } /// Decodes a json value from a `&str`. -pub fn from_slice(v: &[u8]) -> Result +pub fn from_slice(v: &[u8]) -> Result where T: de::Deserialize { from_iter(v.iter().map(|byte| Ok(*byte))) } /// Decodes a json value from a `&str`. -pub fn from_str(s: &str) -> Result +pub fn from_str(s: &str) -> Result where T: de::Deserialize { from_slice(s.as_bytes()) diff --git a/serde_json/src/error.rs b/serde_json/src/error.rs index 171e2459..beaa8a72 100644 --- a/serde_json/src/error.rs +++ b/serde_json/src/error.rs @@ -1,6 +1,7 @@ use std::error; use std::fmt; use std::io; +use std::result; use serde::de; @@ -183,3 +184,6 @@ impl de::Error for Error { Error::MissingFieldError(field) } } + +/// Helper alias for `Result` objects that return a JSON `Error`. +pub type Result = result::Result; diff --git a/serde_json/src/lib.rs b/serde_json/src/lib.rs index 3032db9c..e113127a 100644 --- a/serde_json/src/lib.rs +++ b/serde_json/src/lib.rs @@ -96,7 +96,7 @@ extern crate num; extern crate serde; pub use self::de::{Deserializer, from_str}; -pub use self::error::{Error, ErrorCode}; +pub use self::error::{Error, ErrorCode, Result}; pub use self::ser::{ Serializer, to_writer,