zip-rs-wasm/src/result.rs
Emmanuel Gil Peyrot 70696f57c1 Remove dependency on thiserror
On my computer, this halves the total build time from 11.7s to 5.4s, as
well as the total size of the artifacts in target.

This derive macro is nice, but it doesn’t justify the increase in
compilation time for dependent crates imo.

This effectively reverts #135, although using the up to date APIs from
std::error::Error.
2021-09-06 23:35:57 +02:00

83 lines
2.3 KiB
Rust

//! Error types that can be emitted from this library
use std::error::Error;
use std::fmt;
use std::io;
/// Generic result type with ZipError as its error variant
pub type ZipResult<T> = Result<T, ZipError>;
/// The given password is wrong
#[derive(Debug)]
pub struct InvalidPassword;
impl fmt::Display for InvalidPassword {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "invalid password for file in archive")
}
}
impl Error for InvalidPassword {}
/// Error type for Zip
#[derive(Debug)]
pub enum ZipError {
/// An Error caused by I/O
Io(io::Error),
/// This file is probably not a zip archive
InvalidArchive(&'static str),
/// This archive is not supported
UnsupportedArchive(&'static str),
/// The requested file could not be found in the archive
FileNotFound,
}
impl From<io::Error> for ZipError {
fn from(err: io::Error) -> ZipError {
ZipError::Io(err)
}
}
impl fmt::Display for ZipError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self {
ZipError::Io(err) => write!(fmt, "{}", err),
ZipError::InvalidArchive(err) => write!(fmt, "invalid Zip archive: {}", err),
ZipError::UnsupportedArchive(err) => write!(fmt, "unsupported Zip archive: {}", err),
ZipError::FileNotFound => write!(fmt, "specified file not found in archive"),
}
}
}
impl Error for ZipError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
ZipError::Io(err) => Some(err),
_ => None,
}
}
}
impl ZipError {
/// The text used as an error when a password is required and not supplied
///
/// ```rust,no_run
/// # use zip::result::ZipError;
/// # let mut archive = zip::ZipArchive::new(std::io::Cursor::new(&[])).unwrap();
/// match archive.by_index(1) {
/// Err(ZipError::UnsupportedArchive(ZipError::PASSWORD_REQUIRED)) => eprintln!("a password is needed to unzip this file"),
/// _ => (),
/// }
/// # ()
/// ```
pub const PASSWORD_REQUIRED: &'static str = "Password required to decrypt file";
}
impl From<ZipError> for io::Error {
fn from(err: ZipError) -> io::Error {
io::Error::new(io::ErrorKind::Other, err)
}
}