ari 0.0.6

ari. the extras library.
use winapi::um::handleapi::CloseHandle;
use winapi::um::winnt::HANDLE;

#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct WindowsHandle {
    handle: HANDLE,
}

impl WindowsHandle {
    pub fn new(handle: HANDLE) -> WindowsHandle {
        WindowsHandle { handle: handle }
    }

    pub fn create(
        create: impl FnOnce() -> HANDLE,
        valid: impl FnOnce(HANDLE) -> bool,
    ) -> Result<WindowsHandle, std::io::Error> {
        let handle = create();

        match valid(handle) {
            true => Ok(WindowsHandle { handle }),
            false => Err(std::io::Error::last_os_error()),
        }
    }

    pub fn as_raw(&self) -> HANDLE {
        self.handle
    }
}

impl Drop for WindowsHandle {
    fn drop(&mut self) {
        unsafe {
            if !self.handle.is_null() {
                CloseHandle(self.handle);
            }
        }
    }
}