use nix::errno::Errno;
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum SystemError {
InvalidFileDescriptor,
MemoryFault,
InvalidArgument,
InvalidFileType,
PermissionDenied,
UnknownFourcc,
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::UnknownFourcc => "unknown fourcc",
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 },
}
}
}