1use std::error;
4use std::fmt;
5
6pub use nix::errno::Errno;
7
8#[derive(Debug, PartialEq)]
9pub enum Error {
11 Sys(Errno),
14 Incomplete,
16 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}