From 7662a57727000a6eeb35f4ff6954e981ead10ffd Mon Sep 17 00:00:00 2001 From: Ty Overby Date: Tue, 19 Jan 2016 08:46:33 -0800 Subject: [PATCH] add more useful syntax error messages --- src/serde/reader.rs | 16 ++++++++-------- tests/test.rs | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/serde/reader.rs b/src/serde/reader.rs index f47fa81..495bfde 100644 --- a/src/serde/reader.rs +++ b/src/serde/reader.rs @@ -46,7 +46,7 @@ pub enum DeserializeError { /// If decoding a message takes more than the provided size limit, this /// error is returned. SizeLimit, - SyntaxError, + SyntaxError(String), EndOfStreamError, UnknownFieldError, MissingFieldError, @@ -58,7 +58,7 @@ impl Error for DeserializeError { DeserializeError::IoError(ref err) => Error::description(err), DeserializeError::InvalidEncoding(ref ib) => ib.desc, DeserializeError::SizeLimit => "the size limit for decoding has been reached", - DeserializeError::SyntaxError => "syntax error", + DeserializeError::SyntaxError(ref s) => &*s, DeserializeError::EndOfStreamError => "Unexpected EOF while reading a multi-byte number", DeserializeError::UnknownFieldError => "unknown field error", DeserializeError::MissingFieldError => "missing field error", @@ -70,7 +70,7 @@ impl Error for DeserializeError { DeserializeError::IoError(ref err) => err.cause(), DeserializeError::InvalidEncoding(_) => None, DeserializeError::SizeLimit => None, - DeserializeError::SyntaxError => None, + DeserializeError::SyntaxError(_) => None, DeserializeError::EndOfStreamError => None, DeserializeError::UnknownFieldError => None, DeserializeError::MissingFieldError => None, @@ -98,7 +98,7 @@ impl From for DeserializeError { use serde_crate::de::value::Error; match err { - Error::SyntaxError => DeserializeError::SyntaxError, + Error::SyntaxError => DeserializeError::SyntaxError("syntax error".to_string()), Error::EndOfStreamError => { DeserializeError::EndOfStreamError } @@ -117,8 +117,8 @@ impl fmt::Display for DeserializeError { write!(fmt, "InvalidEncoding: {}", ib), DeserializeError::SizeLimit => write!(fmt, "SizeLimit"), - DeserializeError::SyntaxError => - write!(fmt, "SyntaxError"), + DeserializeError::SyntaxError(ref d) => + write!(fmt, "SyntaxError: {}", d), DeserializeError::EndOfStreamError => write!(fmt, "EndOfStreamError"), DeserializeError::UnknownFieldError => @@ -130,8 +130,8 @@ impl fmt::Display for DeserializeError { } impl serde::de::Error for DeserializeError { - fn syntax(_: &str) -> DeserializeError { - DeserializeError::SyntaxError + fn syntax(desc: &str) -> DeserializeError { + DeserializeError::SyntaxError(desc.into()) } fn end_of_stream() -> DeserializeError { diff --git a/tests/test.rs b/tests/test.rs index 33d8e73..b017c55 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1,4 +1,4 @@ -#![feature(plugin, custom_derive)] +#![feature(plugin, custom_derive, custom_attribute)] #![plugin(serde_macros)] extern crate bincode; @@ -243,7 +243,7 @@ fn deserializing_errors() { fn isize_invalid_deserialize(res: DeserializeResult) { match res { Err(DeserializeError::InvalidEncoding(_)) => {}, - Err(DeserializeError::SyntaxError) => {}, + Err(DeserializeError::SyntaxError(_)) => {}, _ => panic!("Expecting InvalidEncoding, got {:?}", res), } } @@ -475,3 +475,14 @@ fn test_multi_strings_encode() { fn test_multi_strings_serialize() { assert!(serialize(&("foo", "bar", "baz"), Infinite).is_ok()); } + +/* +#[test] +fn path_buf() { + use std::path::{Path, PathBuf}; + let path = Path::new("foo").to_path_buf(); + let serde_encoded = bincode::serde::serialize(&path, Infinite).unwrap(); + let decoded: PathBuf = bincode::serde::deserialize(&serde_encoded).unwrap(); + assert!(path.to_str() == decoded.to_str()); +} +*/