binstall_zip/
result.rs

1//! Error types that can be emitted from this library
2
3use std::error::Error;
4use std::fmt;
5use std::io;
6
7/// Generic result type with ZipError as its error variant
8pub type ZipResult<T> = Result<T, ZipError>;
9
10/// The given password is wrong
11#[derive(Debug)]
12pub struct InvalidPassword;
13
14impl fmt::Display for InvalidPassword {
15    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
16        write!(fmt, "invalid password for file in archive")
17    }
18}
19
20impl Error for InvalidPassword {}
21
22/// Error type for Zip
23#[derive(Debug)]
24pub enum ZipError {
25    /// An Error caused by I/O
26    Io(io::Error),
27
28    /// This file is probably not a zip archive
29    InvalidArchive(&'static str),
30
31    /// This archive is not supported
32    UnsupportedArchive(&'static str),
33
34    /// The requested file could not be found in the archive
35    FileNotFound,
36}
37
38impl From<io::Error> for ZipError {
39    fn from(err: io::Error) -> ZipError {
40        ZipError::Io(err)
41    }
42}
43
44impl fmt::Display for ZipError {
45    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
46        match self {
47            ZipError::Io(err) => write!(fmt, "{}", err),
48            ZipError::InvalidArchive(err) => write!(fmt, "invalid Zip archive: {}", err),
49            ZipError::UnsupportedArchive(err) => write!(fmt, "unsupported Zip archive: {}", err),
50            ZipError::FileNotFound => write!(fmt, "specified file not found in archive"),
51        }
52    }
53}
54
55impl Error for ZipError {
56    fn source(&self) -> Option<&(dyn Error + 'static)> {
57        match self {
58            ZipError::Io(err) => Some(err),
59            _ => None,
60        }
61    }
62}
63
64impl ZipError {
65    /// The text used as an error when a password is required and not supplied
66    ///
67    /// ```rust,no_run
68    /// # use zip::result::ZipError;
69    /// # let mut archive = zip::ZipArchive::new(std::io::Cursor::new(&[])).unwrap();
70    /// match archive.by_index(1) {
71    ///     Err(ZipError::UnsupportedArchive(ZipError::PASSWORD_REQUIRED)) => eprintln!("a password is needed to unzip this file"),
72    ///     _ => (),
73    /// }
74    /// # ()
75    /// ```
76    pub const PASSWORD_REQUIRED: &'static str = "Password required to decrypt file";
77}
78
79impl From<ZipError> for io::Error {
80    fn from(err: ZipError) -> io::Error {
81        io::Error::new(io::ErrorKind::Other, err)
82    }
83}