1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use serde::{de, ser}; use std::fmt::{self, Display}; #[derive(Clone, Debug, PartialEq)] pub enum Error { Message(String), Io(String), SequenceMustHaveLength, LebOverflow, DeserializeAnyNotSupported, DeserializeIdentifierNotSupported, DeserializeIgnoredAnyNotSupported, InvalidBoolEncoding(u8), InvalidCharEncoding(u32), InvalidUtf8Encoding(std::str::Utf8Error), InvalidTagEncoding(usize), NumberOutOfRange, } pub type Result<T> = std::result::Result<T, Error>; impl ser::Error for Error { fn custom<T: Display>(msg: T) -> Self { Error::Message(msg.to_string()) } } impl de::Error for Error { fn custom<T: Display>(msg: T) -> Self { Error::Message(msg.to_string()) } } impl From<std::io::Error> for Error { fn from(err: std::io::Error) -> Error { Error::Io(format!("{}", err)) } } impl From<leb128::read::Error> for Error { fn from(err: leb128::read::Error) -> Error { match err { leb128::read::Error::IoError(err) => Error::Io(format!("{}", err)), leb128::read::Error::Overflow => Error::LebOverflow, } } } impl Display for Error { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str(std::error::Error::description(self)) } } impl std::error::Error for Error { fn description(&self) -> &str { match *self { Error::Message(ref msg) => msg, Error::Io(ref msg) => msg, Error::SequenceMustHaveLength => "SequenceMustHaveLength", Error::DeserializeAnyNotSupported => "DeserializeAnyNotSupported", Error::LebOverflow => "LEB128 Overflow", Error::InvalidBoolEncoding(_) => "Invalid Bool Encoding", Error::InvalidCharEncoding(_) => "Invalid char encoding", Error::DeserializeIdentifierNotSupported => "DeserializeIdentifierNotSupported", Error::DeserializeIgnoredAnyNotSupported => "DeserializeIgnoredAnyNotSupported", Error::InvalidUtf8Encoding(_) => "InvalidUtf8Encoding", Error::InvalidTagEncoding(_) => "InvalidTagEncoding", Error::NumberOutOfRange => "NumberOutOfRange", } } }