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() | |
} | |
} |