use std::error::Error as StdError;
use std::fmt::{Display, Formatter};
use std::result::Result as StdResult;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum Error {
InvalidRequest,
TargetNotFound,
UnsupportedTarget,
TooManyMatches,
EraseError(EraseError),
VerificationError,
IoError(rusb::Error),
MalformedResponse,
}
impl StdError for Error {}
impl Display for Error {
fn fmt(&self, fmt: &mut Formatter) -> StdResult<(), std::fmt::Error> {
if let Error::IoError(err) = self {
write!(fmt, "IO Error: {}", err)
} else {
fmt.write_str(match self {
Error::InvalidRequest => "Invalid request.",
Error::TargetNotFound => "Target not found",
Error::UnsupportedTarget => "Target is unsupported",
Error::TooManyMatches => "Too many matches",
Error::EraseError(_) => "Flash erase error",
Error::VerificationError => "Verification error",
Error::MalformedResponse => "Malformed response",
Error::IoError(_) => unreachable!(),
})
}
}
}
impl From<rusb::Error> for Error {
fn from(error: rusb::Error) -> Self {
Error::IoError(error)
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum EraseError {
Prohibited = 1,
VerifyFailed = 2,
Unknown,
}
impl From<u8> for EraseError {
fn from(code: u8) -> EraseError {
match code {
c if c == EraseError::Prohibited as u8 => EraseError::Prohibited,
c if c == EraseError::VerifyFailed as u8 => EraseError::VerifyFailed,
_ => EraseError::Unknown,
}
}
}
pub type Result<T> = StdResult<T, Error>;