blob: 00d558cb420252c94bd6788a6b03d7eb1d0d5fae [file] [log] [blame]
Yi Kongf19c3f22021-02-13 04:04:00 +08001//! Error types that can be emitted from this library
2
David LeGare132eccb2022-04-11 16:44:12 +00003use std::error::Error;
4use std::fmt;
Yi Kongf19c3f22021-02-13 04:04:00 +08005use std::io;
6
Yi Kongf19c3f22021-02-13 04:04:00 +08007/// Generic result type with ZipError as its error variant
8pub type ZipResult<T> = Result<T, ZipError>;
9
10/// The given password is wrong
David LeGare132eccb2022-04-11 16:44:12 +000011#[derive(Debug)]
Yi Kongf19c3f22021-02-13 04:04:00 +080012pub struct InvalidPassword;
13
David LeGare132eccb2022-04-11 16:44:12 +000014impl 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
Yi Kongf19c3f22021-02-13 04:04:00 +080022/// Error type for Zip
David LeGare132eccb2022-04-11 16:44:12 +000023#[derive(Debug)]
Yi Kongf19c3f22021-02-13 04:04:00 +080024pub enum ZipError {
25 /// An Error caused by I/O
David LeGare132eccb2022-04-11 16:44:12 +000026 Io(io::Error),
Yi Kongf19c3f22021-02-13 04:04:00 +080027
28 /// This file is probably not a zip archive
Yi Kongf19c3f22021-02-13 04:04:00 +080029 InvalidArchive(&'static str),
30
31 /// This archive is not supported
Yi Kongf19c3f22021-02-13 04:04:00 +080032 UnsupportedArchive(&'static str),
33
34 /// The requested file could not be found in the archive
Yi Kongf19c3f22021-02-13 04:04:00 +080035 FileNotFound,
36}
37
David LeGare132eccb2022-04-11 16:44:12 +000038impl 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 {
Jeff Vander Stoep486ff5a2023-02-17 09:53:43 +010047 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}"),
David LeGare132eccb2022-04-11 16:44:12 +000050 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
Joel Galenson45581102021-06-21 14:24:55 -070064impl 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
Yi Kongf19c3f22021-02-13 04:04:00 +080079impl From<ZipError> for io::Error {
80 fn from(err: ZipError) -> io::Error {
81 io::Error::new(io::ErrorKind::Other, err)
82 }
83}
Jeff Vander Stoep486ff5a2023-02-17 09:53:43 +010084
85/// Error type for time parsing
86#[derive(Debug)]
87pub struct DateTimeRangeError;
88
89impl 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
98impl Error for DateTimeRangeError {}