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
use std::error::Error;

pub type Ev3Result<T> = Result<T, Ev3Error>;

#[derive(Debug)]
pub enum Ev3Error {
    InternalError { msg: String },
    NotFound,
    MultipleMatches,
}
impl From<std::io::Error> for Ev3Error {
    fn from(err: std::io::Error) -> Ev3Error {
        Ev3Error::InternalError {
            msg: err.description().to_owned(),
        }
    }
}

pub trait Port {
    fn address(&self) -> String;
}

pub trait OrErr<T> {
    fn or_err(self) -> Ev3Result<T>;
}

impl<T> OrErr<T> for Option<T> {
    fn or_err(self) -> Ev3Result<T> {
        self.ok_or(Ev3Error::InternalError {
            msg: "Cannot unwrap option".to_owned(),
        })
    }
}