lzma/
error.rs

1use lzma_sys::*;
2use std::convert::From;
3use std::result::Result;
4use std::error;
5use std::fmt;
6use std::error::Error as StdError;
7use std::io::Error as IoError;
8
9
10/// An error produced by an operation on LZMA data
11#[derive(Debug)]
12pub enum LzmaError {
13	/// Failed Memory Allocation
14    Mem,
15	/// Memory limit would be violated
16	MemLimit,
17	/// XZ magic bytes weren't found
18	Format,
19	/// Unsupported compression options
20	Options,
21	/// Corrupt data
22	Data,
23	/// Data looks truncated
24	Buf,
25	/// std::io::Error
26	Io(IoError),
27	/// An unknown error
28	Other,
29}
30
31impl fmt::Display for LzmaError {
32	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33		match *self {
34			LzmaError::Mem => write!(f, "Memory allocation failed"),
35			LzmaError::MemLimit => write!(f, "Memory limit would be violated"),
36			LzmaError::Format => write!(f, "XZ magic bytes were not found"),
37			LzmaError::Options => write!(f, "Unsupported compression options"),
38			LzmaError::Data => write!(f, "Corrupt data"),
39			LzmaError::Buf => write!(f, "Data look like it was truncated or possibly corrupt"),
40			LzmaError::Io(ref err) => write!(f, "{}", err),
41			LzmaError::Other => write!(f, "Unknown error"),
42		}
43	}
44}
45
46impl StdError for LzmaError {
47	fn description(&self) -> &str {
48		match *self {
49			LzmaError::Mem => "Memory allocation failed",
50			LzmaError::MemLimit => "Memory limit would be violated",
51			LzmaError::Format => "XZ magic bytes were not found",
52			LzmaError::Options => "Unsupported compression options",
53			LzmaError::Data => "Corrupt data",
54			LzmaError::Buf => "Data look like it was truncated or possibly corrupt",
55			LzmaError::Io(..) => "IO error",
56			LzmaError::Other => "Unknown error",
57		}
58	}
59
60	fn cause(&self) -> Option<&dyn error::Error> {
61		match *self {
62			LzmaError::Io(ref err) => Some(err),
63			_ => None,
64		}
65	}
66}
67
68impl From<IoError> for LzmaError {
69	fn from(err: IoError) -> LzmaError {
70		LzmaError::Io(err)
71	}
72}
73
74
75/* Return values from liblzma are converted into this for easier handling */
76pub type LzmaLibResult = Result<lzma_ret, LzmaError>;
77
78impl From<lzma_ret> for LzmaLibResult {
79	fn from(ret: lzma_ret) -> LzmaLibResult {
80		match ret {
81			lzma_ret::LzmaOk => Ok(ret),
82			lzma_ret::LzmaStreamEnd => Ok(ret),
83			lzma_ret::LzmaNoCheck => Ok(ret),
84			lzma_ret::LzmaUnsupportedCheck => Ok(ret), // NOTE: This is an error in some cases.  Not sure how to handle properly.
85			lzma_ret::LzmaGetCheck => Ok(ret),
86			lzma_ret::LzmaMemError => Err(LzmaError::Mem),
87			lzma_ret::LzmaMemlimitError => Err(LzmaError::MemLimit),
88			lzma_ret::LzmaFormatError => Err(LzmaError::Format),
89			lzma_ret::LzmaOptionsError => Err(LzmaError::Options),
90			lzma_ret::LzmaDataError => Err(LzmaError::Data),
91			lzma_ret::LzmaBufError => Err(LzmaError::Buf),
92			_ => Err(LzmaError::Other),
93		}
94	}
95}