use thiserror::Error;
pub type Result<T> = std::result::Result<T, RustADBError>;
#[derive(Error, Debug)]
pub enum RustADBError {
#[error(transparent)]
IOError(#[from] std::io::Error),
#[error("ADB shell v2 parsing error: {0}")]
ADBShellV2ParseError(String),
#[error("ADB request failed - {0}")]
ADBRequestFailed(String),
#[error("Unknown response type {0}")]
UnknownResponseType(String),
#[error("Wrong response command received: {0}. Expected {1}")]
WrongResponseReceived(String, String),
#[error("Unknown device state {0}")]
UnknownDeviceState(String),
#[error(transparent)]
Utf8StrError(#[from] std::str::Utf8Error),
#[error(transparent)]
Utf8StringError(#[from] std::string::FromUtf8Error),
#[error(transparent)]
AddrParseError(#[from] std::net::AddrParseError),
#[error(transparent)]
RegexError(#[from] regex::Error),
#[error("Regex parsing error: missing field")]
RegexParsingError,
#[error(transparent)]
ParseIntError(#[from] std::num::ParseIntError),
#[error("Conversion error")]
ConversionError,
#[error(transparent)]
IntegerConversionError(#[from] std::num::TryFromIntError),
#[error("Remote ADB server does not support shell feature")]
ADBShellNotSupported,
#[error("Device not found: {0}")]
DeviceNotFound(String),
#[error("Device not paired before attempting to connect")]
ADBDeviceNotPaired,
#[error("Cannot remount filesystem: {0}")]
RemountError(String),
#[error(transparent)]
FramebufferImageError(#[from] image::error::ImageError),
#[error("Cannot convert framebuffer into image")]
FramebufferConversionError,
#[error("Unimplemented framebuffer image version: {0}")]
UnimplementedFramebufferImageVersion(u32),
#[error("Cannot get home directory")]
NoHomeDirectory,
#[cfg(feature = "usb")]
#[cfg_attr(docsrs, doc(cfg(feature = "usb")))]
#[error("USB Error: {0}")]
UsbError(#[from] rusb::Error),
#[cfg(feature = "usb")]
#[cfg_attr(docsrs, doc(cfg(feature = "usb")))]
#[error("Device is busy. Is ADB server running?")]
DeviceBusy,
#[error("USB Device not found: {0} {1}")]
USBDeviceNotFound(u16, u16),
#[error("No USB descriptor found")]
USBNoDescriptorFound,
#[error("Invalid integrity. Expected CRC32 {0}, got {1}")]
InvalidIntegrity(u32, u32),
#[error(transparent)]
Base64DecodeError(#[from] base64::DecodeError),
#[error(transparent)]
Base64EncodeError(#[from] base64::EncodeSliceError),
#[error(transparent)]
RSAError(#[from] rsa::errors::Error),
#[error(transparent)]
TryFromSliceError(#[from] std::array::TryFromSliceError),
#[error("wrong file extension: {0}")]
WrongFileExtension(String),
#[error("error with pkcs8: {0}")]
RsaPkcs8Error(#[from] rsa::pkcs8::Error),
#[error(transparent)]
CertificateGenerationError(#[from] rcgen::Error),
#[error(transparent)]
TLSError(#[from] rustls::Error),
#[error(transparent)]
PemCertError(#[from] rustls_pki_types::pem::Error),
#[error("error while locking data")]
PoisonError,
#[error("upgrade error: {0}")]
UpgradeError(String),
#[cfg(feature = "mdns")]
#[cfg_attr(docsrs, doc(cfg(feature = "mdns")))]
#[error(transparent)]
MDNSError(#[from] mdns_sd::Error),
#[error("error sending data to channel")]
SendError,
#[error("unknown transport: {0}")]
UnknownTransport(String),
#[error("Unknown file mode {0}")]
UnknownFileMode(u32),
}
impl<T> From<std::sync::PoisonError<T>> for RustADBError {
fn from(_err: std::sync::PoisonError<T>) -> Self {
Self::PoisonError
}
}