summaryrefslogtreecommitdiffstats
path: root/third_party/rust/zip/src/result.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/zip/src/result.rs')
-rw-r--r--third_party/rust/zip/src/result.rs94
1 files changed, 94 insertions, 0 deletions
diff --git a/third_party/rust/zip/src/result.rs b/third_party/rust/zip/src/result.rs
new file mode 100644
index 0000000000..d82259ea3d
--- /dev/null
+++ b/third_party/rust/zip/src/result.rs
@@ -0,0 +1,94 @@
+//! Error types that can be emitted from this library
+
+use std::convert;
+use std::error;
+use std::fmt;
+use std::io;
+
+/// Generic result type with ZipError as its error variant
+pub type ZipResult<T> = Result<T, ZipError>;
+
+/// 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 ZipError
+{
+ fn detail(&self) -> ::std::borrow::Cow<str>
+ {
+ use std::error::Error;
+
+ match *self
+ {
+ ZipError::Io(ref io_err) => {
+ ("Io Error: ".to_string() + (io_err as &error::Error).description()).into()
+ },
+ ZipError::InvalidArchive(msg) | ZipError::UnsupportedArchive(msg) => {
+ (self.description().to_string() + ": " + msg).into()
+ },
+ ZipError::FileNotFound => {
+ self.description().into()
+ },
+ }
+ }
+}
+
+impl convert::From<io::Error> for ZipError
+{
+ fn from(err: io::Error) -> ZipError
+ {
+ ZipError::Io(err)
+ }
+}
+
+impl convert::From<ZipError> for io::Error
+{
+ fn from(err: ZipError) -> io::Error
+ {
+ io::Error::new(io::ErrorKind::Other, err)
+ }
+}
+
+impl fmt::Display for ZipError
+{
+ fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error>
+ {
+ fmt.write_str(&*self.detail())
+ }
+}
+
+impl error::Error for ZipError
+{
+ fn description(&self) -> &str
+ {
+ match *self
+ {
+ ZipError::Io(ref io_err) => (io_err as &error::Error).description(),
+ ZipError::InvalidArchive(..) => "Invalid Zip archive",
+ ZipError::UnsupportedArchive(..) => "Unsupported Zip archive",
+ ZipError::FileNotFound => "Specified file not found in archive",
+ }
+ }
+
+ fn cause(&self) -> Option<&error::Error>
+ {
+ match *self
+ {
+ ZipError::Io(ref io_err) => Some(io_err as &error::Error),
+ _ => None,
+ }
+ }
+}