nihdb/
error.rs

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}