1use std::{error, fmt, io, result};
3
4pub type Result<T> = result::Result<T, Error>;
7
8#[derive(Debug)]
10pub enum ParseHexError {
11 Range {
13 min: usize,
15 max: usize,
17 got: usize,
19 },
20 Size {
22 expect: usize,
24 actual: usize,
26 },
27 Char {
29 val: char,
31 },
32}
33
34impl fmt::Display for ParseHexError {
35 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
36 match *self {
37 ParseHexError::Range {
38 ref min,
39 ref max,
40 ref got,
41 } => write!(
42 f,
43 "expected buff size in `{}...{}`, got `{}`",
44 min, max, got
45 ),
46 ParseHexError::Size {
47 ref expect,
48 ref actual,
49 } => write!(f, "expected buff size `{}` got `{}`", expect, actual),
50 ParseHexError::Char { ref val } => write!(f, "non-hex character `{}`", val),
51 }
52 }
53}
54
55impl error::Error for ParseHexError {
56 fn description(&self) -> &str {
57 match *self {
58 ParseHexError::Range { .. } => "hexadecimal outside valid range",
59 ParseHexError::Size { .. } => "invalid hexadecimal size",
60 ParseHexError::Char { .. } => "non-hex character",
61 }
62 }
63}
64
65#[derive(Debug)]
67pub enum Error {
68 IoError(io::Error),
70 Parsing(ParseHexError),
72}
73
74impl fmt::Display for Error {
77 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
78 match *self {
79 Error::IoError(ref err) => err.fmt(f),
80 Error::Parsing(ref err) => err.fmt(f),
81 }
82 }
83}
84
85impl error::Error for Error {
87 fn description(&self) -> &str {
88 match *self {
89 Error::IoError(ref err) => err.description(),
90 Error::Parsing(ref err) => err.description(),
91 }
92 }
93
94 fn cause(&self) -> Option<&error::Error> {
95 match *self {
96 Error::IoError(ref err) => Some(err),
97 Error::Parsing(ref err) => Some(err),
98 }
99 }
100}
101
102impl From<io::Error> for Error {
103 fn from(err: io::Error) -> Self {
104 Error::IoError(err)
105 }
106}
107
108impl From<ParseHexError> for Error {
109 fn from(err: ParseHexError) -> Self {
110 Error::Parsing(err)
111 }
112}