use std::error::Error as StdError;
use std::fmt::{self, Display, Formatter};
use std::convert::From;
use serial_unit_testing::error::Error as SerialError;
use super::reply::P50XReply;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
UnknownDevice,
Serial(SerialError),
UnknownResponse(String),
Reply(P50XReply),
Other
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match *self {
Error::UnknownDevice => write!(f, "Unknown device"),
Error::Serial(ref cause) => write!(f, "Serial Error: {}", cause.to_string()),
Error::UnknownResponse(ref cause) => write!(f, "Unknown response: {}", cause),
Error::Reply(ref cause) => write!(f, "P50X Reply: {:?}", cause),
Error::Other => write!(f, "Unknown error")
}
}
}
impl StdError for Error {
fn description(&self) -> &str {
match *self {
Error::UnknownDevice => "Unknown analyzer device",
Error::Serial(ref cause) => cause.description(),
Error::UnknownResponse(_) => "Unkonwn response",
Error::Reply(_) => "P50X Reply",
Error::Other => "Unknown error"
}
}
fn cause(&self) -> Option<&dyn StdError> {
match *self {
Error::Serial(ref cause) => Some(cause),
_ => None
}
}
}
impl From<SerialError> for Error {
fn from(cause: SerialError) -> Error {
Error::Serial(cause)
}
}
impl From<P50XReply> for Error {
fn from(cause: P50XReply) -> Error {
Error::Reply(cause)
}
}