alpm_ll/
error.rs

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}