1 | //! Error types that can be emitted from this library |
2 | |
3 | use std::error::Error; |
4 | use std::fmt; |
5 | use std::io; |
6 | |
7 | /// Generic result type with ZipError as its error variant |
8 | pub type ZipResult<T> = Result<T, ZipError>; |
9 | |
10 | /// The given password is wrong |
11 | #[derive (Debug)] |
12 | pub struct InvalidPassword; |
13 | |
14 | impl 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 | |
20 | impl Error for InvalidPassword {} |
21 | |
22 | /// Error type for Zip |
23 | #[derive (Debug)] |
24 | pub 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 | |
38 | impl From<io::Error> for ZipError { |
39 | fn from(err: io::Error) -> ZipError { |
40 | ZipError::Io(err) |
41 | } |
42 | } |
43 | |
44 | impl fmt::Display for ZipError { |
45 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
46 | match self { |
47 | ZipError::Io(err: &Error) => write!(fmt, " {err}" ), |
48 | ZipError::InvalidArchive(err: &&str) => write!(fmt, "invalid Zip archive: {err}" ), |
49 | ZipError::UnsupportedArchive(err: &&str) => write!(fmt, "unsupported Zip archive: {err}" ), |
50 | ZipError::FileNotFound => write!(fmt, "specified file not found in archive" ), |
51 | } |
52 | } |
53 | } |
54 | |
55 | impl Error for ZipError { |
56 | fn source(&self) -> Option<&(dyn Error + 'static)> { |
57 | match self { |
58 | ZipError::Io(err: &Error) => Some(err), |
59 | _ => None, |
60 | } |
61 | } |
62 | } |
63 | |
64 | impl 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 | |
79 | impl From<ZipError> for io::Error { |
80 | fn from(err: ZipError) -> io::Error { |
81 | io::Error::new(kind:io::ErrorKind::Other, error:err) |
82 | } |
83 | } |
84 | |
85 | /// Error type for time parsing |
86 | #[derive (Debug)] |
87 | pub struct DateTimeRangeError; |
88 | |
89 | impl fmt::Display for DateTimeRangeError { |
90 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
91 | write!( |
92 | fmt, |
93 | "a date could not be represented within the bounds the MS-DOS date range (1980-2107)" |
94 | ) |
95 | } |
96 | } |
97 | |
98 | impl Error for DateTimeRangeError {} |
99 | |