1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use nix::errno::Errno;
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum SystemError {
InvalidFileDescriptor,
MemoryFault,
InvalidArgument,
InvalidFileType,
PermissionDenied,
Unknown {
errno: Errno,
},
}
impl fmt::Display for SystemError {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> fmt::Result {
fmt.write_str(match self {
SystemError::InvalidFileDescriptor => "invalid file descriptor",
SystemError::MemoryFault => "invalid memory access",
SystemError::InvalidArgument => "invalid argument",
SystemError::InvalidFileType => "invalid file type",
SystemError::PermissionDenied => "permission denied",
SystemError::Unknown { errno } => {
return write!(fmt, "unknown system error: {}", errno)
}
})
}
}
impl Error for SystemError {}
impl From<Errno> for SystemError {
fn from(errno: Errno) -> SystemError {
match errno {
Errno::EBADF => SystemError::InvalidFileDescriptor,
Errno::EFAULT => SystemError::MemoryFault,
Errno::EINVAL => SystemError::InvalidArgument,
Errno::ENOTTY => SystemError::InvalidFileDescriptor,
Errno::EACCES => SystemError::PermissionDenied,
_ => SystemError::Unknown { errno },
}
}
}