use std::error::Error as StdError;
use std::fmt;
pub type Result<T> = ::std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
SameAddress,
InvalidCode,
NoPatchArea,
NotExecutable,
NotInitialized,
AlreadyInitialized,
OutOfMemory,
UnsupportedInstruction,
RegionFailure(region::Error),
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
if let Error::RegionFailure(error) = self {
Some(error)
} else {
None
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Error::SameAddress => write!(f, "Target and detour address is the same"),
Error::InvalidCode => write!(f, "Address contains invalid assembly"),
Error::NoPatchArea => write!(f, "Cannot find an inline patch area"),
Error::NotExecutable => write!(f, "Address is not executable"),
Error::NotInitialized => write!(f, "Detour is not initialized"),
Error::AlreadyInitialized => write!(f, "Detour is already initialized"),
Error::OutOfMemory => write!(f, "Cannot allocate memory"),
Error::UnsupportedInstruction => write!(f, "Address contains an unsupported instruction"),
Error::RegionFailure(ref error) => write!(f, "{}", error),
}
}
}
impl From<region::Error> for Error {
fn from(error: region::Error) -> Self {
Error::RegionFailure(error)
}
}