diff --git a/libraries/libarchive/src/error.rs b/libraries/libarchive/src/error.rs index 88ff4ea1..0c5c70de 100644 --- a/libraries/libarchive/src/error.rs +++ b/libraries/libarchive/src/error.rs @@ -1,3 +1,5 @@ +use std::error; +use std::fmt; use archive; pub type ArchiveResult = Result; @@ -5,13 +7,39 @@ pub type ArchiveResult = Result; #[derive(Debug)] pub struct ErrCode(i32); +impl fmt::Display for ErrCode { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, "{}", self.0) + } +} + #[derive(Debug)] pub enum ArchiveError { Consumed, - Sys(ErrCode, String), - ReadFailure, - WriteFailure, HeaderPosition, + Sys(ErrCode, String), +} + +impl error::Error for ArchiveError { + fn description(&self) -> &str { + match self { + &ArchiveError::Consumed => "Builder already consumed", + &ArchiveError::HeaderPosition => "Header position expected to be 0", + &ArchiveError::Sys(_, _) => "libarchive system error", + } + } +} + +impl fmt::Display for ArchiveError { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + match self { + &ArchiveError::Consumed => write!(fmt, "Builder already consumed"), + &ArchiveError::HeaderPosition => write!(fmt, "Header position expected to be 0"), + &ArchiveError::Sys(ref code, ref msg) => { + write!(fmt, "{} (libarchive err_code={})", msg, code) + } + } + } } impl<'a> From<&'a archive::Handle> for ArchiveError {