1use std;
2
3pub type Result<T> = std::result::Result<T, Error>;
4
5pub fn mk_err<T>(msg: &str) -> Result<T> { Err(Error::new(msg)) }
6
7#[derive(Debug)]
8pub enum Error {
9 IoError(std::io::Error),
10 MsgError(String),
11}
12
13impl Error {
14 pub fn new(msg: &str) -> Error {
15 return Error::MsgError(msg.to_string());
16 }
17
18 pub fn msg(&self) -> &str {
19 return match self {
20 &Error::IoError(ref e) => (e as &std::error::Error).description(),
21 &Error::MsgError(ref s) => &s,
22 };
23 }
24}
25
26pub trait OptionExt<T> {
27 fn or_err(self, msg: &str) -> std::result::Result<T, Error>;
28}
29
30impl<T> OptionExt<T> for Option<T> {
31 fn or_err(self, msg: &str) -> std::result::Result<T, Error> {
32 if let Some(x) = self {
33 return Ok(x);
34 }
35 return Err(Error::new(msg));
36 }
37}
38
39impl std::fmt::Display for Error {
40 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
41 return write!(f, "{}", self.msg());
42 }
43}
44
45impl std::error::Error for Error {
46 fn description(&self) -> &str { self.msg() }
47
48 fn cause(&self) -> Option<&std::error::Error> {
49 return match self {
50 &Error::IoError(ref e) => Some(e),
51 &Error::MsgError(_) => None,
52 }
53 }
54}
55
56impl From<std::io::Error> for Error {
57 fn from(e: std::io::Error) -> Error { Error::IoError(e) }
58}