|  | use std::error::Error as StdError; | 
|  | use std::io; | 
|  | use std::str::Utf8Error; | 
|  | use std::{error, fmt}; | 
|  |  | 
|  | use serde; | 
|  |  | 
|  | /// The result of a serialization or deserialization operation. | 
|  | pub type Result<T> = ::std::result::Result<T, Error>; | 
|  |  | 
|  | /// An error that can be produced during (de)serializing. | 
|  | pub type Error = Box<ErrorKind>; | 
|  |  | 
|  | /// The kind of error that can be produced during a serialization or deserialization. | 
|  | #[derive(Debug)] | 
|  | pub enum ErrorKind { | 
|  | /// If the error stems from the reader/writer that is being used | 
|  | /// during (de)serialization, that error will be stored and returned here. | 
|  | Io(io::Error), | 
|  | /// Returned if the deserializer attempts to deserialize a string that is not valid utf8 | 
|  | InvalidUtf8Encoding(Utf8Error), | 
|  | /// Returned if the deserializer attempts to deserialize a bool that was | 
|  | /// not encoded as either a 1 or a 0 | 
|  | InvalidBoolEncoding(u8), | 
|  | /// Returned if the deserializer attempts to deserialize a char that is not in the correct format. | 
|  | InvalidCharEncoding, | 
|  | /// Returned if the deserializer attempts to deserialize the tag of an enum that is | 
|  | /// not in the expected ranges | 
|  | InvalidTagEncoding(usize), | 
|  | /// Serde has a deserialize_any method that lets the format hint to the | 
|  | /// object which route to take in deserializing. | 
|  | DeserializeAnyNotSupported, | 
|  | /// If (de)serializing a message takes more than the provided size limit, this | 
|  | /// error is returned. | 
|  | SizeLimit, | 
|  | /// Bincode can not encode sequences of unknown length (like iterators). | 
|  | SequenceMustHaveLength, | 
|  | /// A custom error message from Serde. | 
|  | Custom(String), | 
|  | } | 
|  |  | 
|  | impl StdError for ErrorKind { | 
|  | fn description(&self) -> &str { | 
|  | match *self { | 
|  | ErrorKind::Io(ref err) => error::Error::description(err), | 
|  | ErrorKind::InvalidUtf8Encoding(_) => "string is not valid utf8", | 
|  | ErrorKind::InvalidBoolEncoding(_) => "invalid u8 while decoding bool", | 
|  | ErrorKind::InvalidCharEncoding => "char is not valid", | 
|  | ErrorKind::InvalidTagEncoding(_) => "tag for enum is not valid", | 
|  | ErrorKind::SequenceMustHaveLength => { | 
|  | "Bincode can only encode sequences and maps that have a knowable size ahead of time" | 
|  | } | 
|  | ErrorKind::DeserializeAnyNotSupported => { | 
|  | "Bincode doesn't support serde::Deserializer::deserialize_any" | 
|  | } | 
|  | ErrorKind::SizeLimit => "the size limit has been reached", | 
|  | ErrorKind::Custom(ref msg) => msg, | 
|  | } | 
|  | } | 
|  |  | 
|  | fn cause(&self) -> Option<&error::Error> { | 
|  | match *self { | 
|  | ErrorKind::Io(ref err) => Some(err), | 
|  | ErrorKind::InvalidUtf8Encoding(_) => None, | 
|  | ErrorKind::InvalidBoolEncoding(_) => None, | 
|  | ErrorKind::InvalidCharEncoding => None, | 
|  | ErrorKind::InvalidTagEncoding(_) => None, | 
|  | ErrorKind::SequenceMustHaveLength => None, | 
|  | ErrorKind::DeserializeAnyNotSupported => None, | 
|  | ErrorKind::SizeLimit => None, | 
|  | ErrorKind::Custom(_) => None, | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl From<io::Error> for Error { | 
|  | fn from(err: io::Error) -> Error { | 
|  | ErrorKind::Io(err).into() | 
|  | } | 
|  | } | 
|  |  | 
|  | impl fmt::Display for ErrorKind { | 
|  | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | 
|  | match *self { | 
|  | ErrorKind::Io(ref ioerr) => write!(fmt, "io error: {}", ioerr), | 
|  | ErrorKind::InvalidUtf8Encoding(ref e) => write!(fmt, "{}: {}", self.description(), e), | 
|  | ErrorKind::InvalidBoolEncoding(b) => { | 
|  | write!(fmt, "{}, expected 0 or 1, found {}", self.description(), b) | 
|  | } | 
|  | ErrorKind::InvalidCharEncoding => write!(fmt, "{}", self.description()), | 
|  | ErrorKind::InvalidTagEncoding(tag) => { | 
|  | write!(fmt, "{}, found {}", self.description(), tag) | 
|  | } | 
|  | ErrorKind::SequenceMustHaveLength => write!(fmt, "{}", self.description()), | 
|  | ErrorKind::SizeLimit => write!(fmt, "{}", self.description()), | 
|  | ErrorKind::DeserializeAnyNotSupported => write!( | 
|  | fmt, | 
|  | "Bincode does not support the serde::Deserializer::deserialize_any method" | 
|  | ), | 
|  | ErrorKind::Custom(ref s) => s.fmt(fmt), | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl serde::de::Error for Error { | 
|  | fn custom<T: fmt::Display>(desc: T) -> Error { | 
|  | ErrorKind::Custom(desc.to_string()).into() | 
|  | } | 
|  | } | 
|  |  | 
|  | impl serde::ser::Error for Error { | 
|  | fn custom<T: fmt::Display>(msg: T) -> Self { | 
|  | ErrorKind::Custom(msg.to_string()).into() | 
|  | } | 
|  | } |