use crate::huffman::HuffmanError;
use bitreader::BitReaderError;
use std::array::TryFromSliceError;
use std::ffi::FromBytesWithNulError;
use std::fmt::Display;
use std::io::ErrorKind;
use std::str::Utf8Error;
#[derive(Debug)]
#[repr(C)]
pub enum Error {
None,
NoInterface,
OutOfMemory,
InvalidFile,
InvalidParameter,
InvalidData,
FileNotFound,
RequiresParent,
FileNotWriteable,
ReadError,
WriteError,
CodecError,
InvalidParent,
HunkOutOfRange,
DecompressionError,
CompressionError,
CantCreateFile,
CantVerify,
NotSupported,
MetadataNotFound,
InvalidMetadataSize,
UnsupportedVersion,
VerifyIncomplete,
InvalidMetadata,
InvalidState,
OperationPending,
NoAsyncOperation,
UnsupportedFormat,
Unknown,
}
impl std::error::Error for Error {}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::None => f.write_str("no error"),
Error::NoInterface => f.write_str("no drive interface"),
Error::OutOfMemory => f.write_str("out of memory"),
Error::InvalidFile => f.write_str("invalid file"),
Error::InvalidParameter => f.write_str("invalid parameter"),
Error::InvalidData => f.write_str("invalid data"),
Error::FileNotFound => f.write_str("file not found"),
Error::RequiresParent => f.write_str("requires parent"),
Error::FileNotWriteable => f.write_str("file not writeable"),
Error::ReadError => f.write_str("read error"),
Error::WriteError => f.write_str("write error"),
Error::CodecError => f.write_str("codec error"),
Error::InvalidParent => f.write_str("invalid parent"),
Error::HunkOutOfRange => f.write_str("hunk out of range"),
Error::DecompressionError => f.write_str("decompression error"),
Error::CompressionError => f.write_str("compression error"),
Error::CantCreateFile => f.write_str("can't create file"),
Error::CantVerify => f.write_str("can't verify file"),
Error::NotSupported => f.write_str("operation not supported"),
Error::MetadataNotFound => f.write_str("can't find metadata"),
Error::InvalidMetadataSize => f.write_str("invalid metadata size"),
Error::UnsupportedVersion => f.write_str("unsupported CHD version"),
Error::VerifyIncomplete => f.write_str("incomplete verify"),
Error::InvalidMetadata => f.write_str("invalid metadata"),
Error::InvalidState => f.write_str("invalid state"),
Error::OperationPending => f.write_str("operation pending"),
Error::NoAsyncOperation => f.write_str("no async operation in progress"),
Error::UnsupportedFormat => f.write_str("unsupported format"),
Error::Unknown => f.write_str("undocumented error"),
}
}
}
impl From<TryFromSliceError> for Error {
fn from(_: TryFromSliceError) -> Self {
Error::InvalidFile
}
}
impl From<BitReaderError> for Error {
fn from(_: BitReaderError) -> Self {
Error::ReadError
}
}
impl From<FromBytesWithNulError> for Error {
fn from(_: FromBytesWithNulError) -> Self {
Error::InvalidData
}
}
impl From<Utf8Error> for Error {
fn from(_: Utf8Error) -> Self {
Error::InvalidData
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
match err.kind() {
ErrorKind::NotFound => Error::FileNotFound,
ErrorKind::PermissionDenied => Error::NotSupported,
ErrorKind::ConnectionRefused => Error::Unknown,
ErrorKind::ConnectionReset => Error::Unknown,
ErrorKind::ConnectionAborted => Error::Unknown,
ErrorKind::NotConnected => Error::Unknown,
ErrorKind::AddrInUse => Error::Unknown,
ErrorKind::AddrNotAvailable => Error::Unknown,
ErrorKind::BrokenPipe => Error::Unknown,
ErrorKind::AlreadyExists => Error::CantCreateFile,
ErrorKind::WouldBlock => Error::Unknown,
ErrorKind::InvalidInput => Error::InvalidParameter,
ErrorKind::InvalidData => Error::InvalidData,
ErrorKind::TimedOut => Error::Unknown,
ErrorKind::WriteZero => Error::WriteError,
ErrorKind::Interrupted => Error::Unknown,
ErrorKind::Other => Error::Unknown,
ErrorKind::UnexpectedEof => Error::ReadError,
ErrorKind::Unsupported => Error::NotSupported,
ErrorKind::OutOfMemory => Error::OutOfMemory,
_ => Error::Unknown,
}
}
}
impl From<HuffmanError> for Error {
fn from(_e: HuffmanError) -> Self {
Error::DecompressionError
}
}
impl From<Error> for std::io::Error {
fn from(e: Error) -> Self {
std::io::Error::new(ErrorKind::Other, e)
}
}
pub type Result<T> = std::result::Result<T, Error>;