serde_hex/types.rs
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
//! Miscellaneous type used by this crate.
use std::{error, fmt, io, result};
/// An alias of `std::result::Result` with this crate's
/// `Error` type inserted by default.
pub type Result<T> = result::Result<T, Error>;
/// error raised during hexadecimal parsing operations
#[derive(Debug)]
pub enum ParseHexError {
/// hexadecimal buffer was outside allowed range
Range {
/// minimum allowed size
min: usize,
/// maximum allowed size
max: usize,
/// size the was found
got: usize,
},
/// hexadecimal buffer was of expected size
Size {
/// expected size
expect: usize,
/// size that was found
actual: usize,
},
/// non-hexadecimal character encountered
Char {
/// value encountered
val: char,
},
}
impl fmt::Display for ParseHexError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ParseHexError::Range {
ref min,
ref max,
ref got,
} => write!(
f,
"expected buff size in `{}...{}`, got `{}`",
min, max, got
),
ParseHexError::Size {
ref expect,
ref actual,
} => write!(f, "expected buff size `{}` got `{}`", expect, actual),
ParseHexError::Char { ref val } => write!(f, "non-hex character `{}`", val),
}
}
}
impl error::Error for ParseHexError {
fn description(&self) -> &str {
match *self {
ParseHexError::Range { .. } => "hexadecimal outside valid range",
ParseHexError::Size { .. } => "invalid hexadecimal size",
ParseHexError::Char { .. } => "non-hex character",
}
}
}
/// top-level error kind of this crate
#[derive(Debug)]
pub enum Error {
/// error raised during i/o operations
IoError(io::Error),
/// error raised during parsing operations
Parsing(ParseHexError),
}
// implement `Display` to allow user-facing errors. Required
// by the `std::error::Error` trait.
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::IoError(ref err) => err.fmt(f),
Error::Parsing(ref err) => err.fmt(f),
}
}
}
// implement the standard error trait for hexadecimal errors.
impl error::Error for Error {
fn description(&self) -> &str {
match *self {
Error::IoError(ref err) => err.description(),
Error::Parsing(ref err) => err.description(),
}
}
fn cause(&self) -> Option<&error::Error> {
match *self {
Error::IoError(ref err) => Some(err),
Error::Parsing(ref err) => Some(err),
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::IoError(err)
}
}
impl From<ParseHexError> for Error {
fn from(err: ParseHexError) -> Self {
Error::Parsing(err)
}
}