An error class which wraps errno results
This commit is contained in:
parent
1cef90bfff
commit
d3e2076ea5
70
rust/src/system/errno.rs
Normal file
70
rust/src/system/errno.rs
Normal file
@ -0,0 +1,70 @@
|
||||
use std::fmt::{self, Display};
|
||||
use std::io;
|
||||
use std::result;
|
||||
|
||||
use libc::__errno_location;
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
pub struct Error(i32);
|
||||
pub type Result<T> = result::Result<T, Error>;
|
||||
|
||||
impl Error {
|
||||
pub fn from_raw_os_error(e: i32) -> Error {
|
||||
Error(e)
|
||||
}
|
||||
|
||||
pub fn last_os_error() -> Error {
|
||||
Error(unsafe { *__errno_location() })
|
||||
}
|
||||
|
||||
pub fn errno(self) -> i32 {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl From<io::Error> for Error {
|
||||
fn from(e: io::Error) -> Self {
|
||||
Error::from_raw_os_error(e.raw_os_error().unwrap_or_default())
|
||||
}
|
||||
}
|
||||
|
||||
impl std::error::Error for Error {}
|
||||
|
||||
impl Display for Error {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
io::Error::from_raw_os_error(self.0).fmt(f)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn errno_result<T>() -> Result<T> {
|
||||
Err(Error::last_os_error())
|
||||
}
|
||||
|
||||
pub fn cvt<T: IsMinusOne>(t: T) -> io::Result<T> {
|
||||
if t.is_minus_one() {
|
||||
Err(io::Error::last_os_error())
|
||||
} else {
|
||||
Ok(t)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait IsMinusOne {
|
||||
fn is_minus_one(&self) -> bool;
|
||||
}
|
||||
|
||||
impl IsMinusOne for i32 {
|
||||
fn is_minus_one(&self) -> bool {
|
||||
*self == -1
|
||||
}
|
||||
}
|
||||
impl IsMinusOne for i64 {
|
||||
fn is_minus_one(&self) -> bool {
|
||||
*self == -1
|
||||
}
|
||||
}
|
||||
|
||||
impl IsMinusOne for isize {
|
||||
fn is_minus_one(&self) -> bool {
|
||||
*self == -1
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user