1use crate::{Alpm, LIBRARY, Library};
2
3use std::error;
4use std::ffi::CStr;
5use std::fmt;
6use std::mem::transmute;
7
8use alpm_sys_ll::_alpm_errno_t::*;
9use alpm_sys_ll::*;
10
11pub type Result<T> = std::result::Result<T, Error>;
12
13#[repr(u32)]
14#[derive(Debug, Eq, PartialEq, Copy, Clone, Ord, PartialOrd, Hash)]
15pub enum Error {
16 Ok = ALPM_ERR_OK as u32,
17 Memory = ALPM_ERR_MEMORY as u32,
18 System = ALPM_ERR_SYSTEM as u32,
19 BadPerms = ALPM_ERR_BADPERMS as u32,
20 NotAFile = ALPM_ERR_NOT_A_FILE as u32,
21 NotADir = ALPM_ERR_NOT_A_DIR as u32,
22 WrongArgs = ALPM_ERR_WRONG_ARGS as u32,
23 DiskSpace = ALPM_ERR_DISK_SPACE as u32,
24 HandleNull = ALPM_ERR_HANDLE_NULL as u32,
25 HandleNotNull = ALPM_ERR_HANDLE_NOT_NULL as u32,
26 HandleLock = ALPM_ERR_HANDLE_LOCK as u32,
27 DbOpen = ALPM_ERR_DB_OPEN as u32,
28 DbCreate = ALPM_ERR_DB_CREATE as u32,
29 DbNull = ALPM_ERR_DB_NULL as u32,
30 DbNotNull = ALPM_ERR_DB_NOT_NULL as u32,
31 DbNotFound = ALPM_ERR_DB_NOT_FOUND as u32,
32 DbInvalid = ALPM_ERR_DB_INVALID as u32,
33 DbInvalidSig = ALPM_ERR_DB_INVALID_SIG as u32,
34 DbVersion = ALPM_ERR_DB_VERSION as u32,
35 DbWrite = ALPM_ERR_DB_WRITE as u32,
36 DbRemove = ALPM_ERR_DB_REMOVE as u32,
37 ServerBadUrl = ALPM_ERR_SERVER_BAD_URL as u32,
38 ServerNone = ALPM_ERR_SERVER_NONE as u32,
39 TransNotNull = ALPM_ERR_TRANS_NOT_NULL as u32,
40 TransNull = ALPM_ERR_TRANS_NULL as u32,
41 TransDupTarget = ALPM_ERR_TRANS_DUP_TARGET as u32,
42 TransDupFileName = ALPM_ERR_TRANS_DUP_FILENAME as u32,
43 TransNotInitialized = ALPM_ERR_TRANS_NOT_INITIALIZED as u32,
44 TransNotPrepared = ALPM_ERR_TRANS_NOT_PREPARED as u32,
45 TransAbort = ALPM_ERR_TRANS_ABORT as u32,
46 TransType = ALPM_ERR_TRANS_TYPE as u32,
47 TransNotLocked = ALPM_ERR_TRANS_NOT_LOCKED as u32,
48 TransHookFailed = ALPM_ERR_TRANS_HOOK_FAILED as u32,
49 PkgNotFound = ALPM_ERR_PKG_NOT_FOUND as u32,
50 PkgIgnored = ALPM_ERR_PKG_IGNORED as u32,
51 PkgInvalid = ALPM_ERR_PKG_INVALID as u32,
52 PkgInvalidChecksum = ALPM_ERR_PKG_INVALID_CHECKSUM as u32,
53 PkgInvalidSig = ALPM_ERR_PKG_INVALID_SIG as u32,
54 PkgMissingSig = ALPM_ERR_PKG_MISSING_SIG as u32,
55 PkgOpen = ALPM_ERR_PKG_OPEN as u32,
56 PkgCantRemove = ALPM_ERR_PKG_CANT_REMOVE as u32,
57 PkgInvalidName = ALPM_ERR_PKG_INVALID_NAME as u32,
58 PkgInvalidArch = ALPM_ERR_PKG_INVALID_ARCH as u32,
59 SigMissing = ALPM_ERR_SIG_MISSING as u32,
60 SigInvalid = ALPM_ERR_SIG_INVALID as u32,
61 UnsatisfiedDeps = ALPM_ERR_UNSATISFIED_DEPS as u32,
62 ConflictingDeps = ALPM_ERR_CONFLICTING_DEPS as u32,
63 FileConflicts = ALPM_ERR_FILE_CONFLICTS as u32,
64 Retrieve = ALPM_ERR_RETRIEVE as u32,
65 InvalidRegex = ALPM_ERR_INVALID_REGEX as u32,
66 Libarchive = ALPM_ERR_LIBARCHIVE as u32,
67 Libcurl = ALPM_ERR_LIBCURL as u32,
68 ExternalDownload = ALPM_ERR_EXTERNAL_DOWNLOAD as u32,
69 Gpgme = ALPM_ERR_GPGME as u32,
70 MissingCapabilitySignatures = ALPM_ERR_MISSING_CAPABILITY_SIGNATURES as u32,
71 FailedLoading
72}
73
74impl Error {
75 pub(crate) unsafe fn new(err: alpm_errno_t) -> Error {
76 transmute::<alpm_errno_t, Error>(err)
77 }
78}
79
80impl Alpm {
81 pub fn last_error(&self) -> Error {
82 unsafe { Error::new(self.lib.alpm_errno(self.as_ptr())) }
83 }
84}
85
86impl Error {
87 pub fn ok(self) -> bool {
88 self == Error::Ok
89 }
90}
91
92impl fmt::Display for Error {
93 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
94 let err = unsafe { transmute::<Error, alpm_errno_t>(*self) };
95 let s = unsafe { CStr::from_ptr(LIBRARY.force_load().alpm_strerror(err)) };
96 fmt.write_str(s.to_str().unwrap())
97 }
98}
99
100impl error::Error for Error {}
101
102#[cfg(test)]
103mod tests {
104 use crate::Alpm;
105
106 #[test]
107 fn display() {
108 let handle = Alpm::new("/", "tests/db").unwrap();
109
110 println!("{}", handle.last_error());
111 }
112}