linux_kcapi/
err.rs

1//! Error definition for this crate
2
3use std::error;
4use std::fmt;
5
6pub use nix::errno::Errno;
7
8#[derive(Debug, PartialEq)]
9/// KCAPI errors
10pub enum Error {
11    /// Error from C.
12    /// See `man 3 errno`
13    Sys(Errno),
14    /// Operation did not complete
15    Incomplete,
16    /// Unknown error
17    Unmanaged,
18}
19
20impl fmt::Display for Error {
21    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22        match self {
23            Error::Sys(e) => write!(f, "Error from C ({})", e),
24            Error::Incomplete => write!(f, "Operation did not complete"),
25            Error::Unmanaged => write!(f, "Unmanaged error"),
26        }
27    }
28}
29
30impl error::Error for Error {
31    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
32        None
33    }
34}
35
36impl From<nix::Error> for Error {
37    fn from(e: nix::Error) -> Self {
38        Self::Sys(e)
39    }
40}
41
42impl From<i32> for Error {
43    fn from(error: i32) -> Self {
44        Self::Sys(Errno::from_i32(error))
45    }
46}
47
48use core::num::NonZeroU32;
49
50#[cfg(feature = "rand_trait")]
51impl Into<rand_core::Error> for Error {
52    fn into(self) -> rand_core::Error {
53        let r = unsafe { NonZeroU32::new_unchecked(0xFFFF_FFFF) };
54
55        match self {
56            Error::Sys(e) => NonZeroU32::new(e as u32)
57                .map_or_else(|| rand_core::Error::from(r), rand_core::Error::from),
58            _ => rand_core::Error::from(r),
59        }
60    }
61}