interprocess 2.2.2

Interprocess communication toolkit
Documentation
pub(super) mod winprelude {
	pub(crate) use super::{AsRawHandleExt as _, HANDLEExt as _};
	pub(crate) use std::os::windows::prelude::*;
	pub(crate) use windows_sys::Win32::Foundation::{HANDLE, INVALID_HANDLE_VALUE};
}

use std::io::{self, ErrorKind::BrokenPipe};
use winprelude::*;

use crate::RawOsErrorExt as _;

pub(crate) trait AsRawHandleExt: AsRawHandle {
	#[inline(always)]
	#[allow(clippy::as_conversions)]
	fn as_int_handle(&self) -> HANDLE {
		self.as_raw_handle() as HANDLE
	}
}
impl<T: AsRawHandle + ?Sized> AsRawHandleExt for T {}

pub(crate) trait HANDLEExt {
	fn to_std(self) -> RawHandle;
}
impl HANDLEExt for HANDLE {
	#[inline(always)]
	#[allow(clippy::as_conversions)]
	fn to_std(self) -> RawHandle {
		self as RawHandle
	}
}

pub(super) fn decode_eof<T>(r: io::Result<T>) -> io::Result<T> {
	use windows_sys::Win32::Foundation::ERROR_PIPE_NOT_CONNECTED;
	match r {
		Err(e) if e.raw_os_error().eeq(ERROR_PIPE_NOT_CONNECTED) => {
			Err(io::Error::from(BrokenPipe))
		}
		els => els,
	}
}
pub(super) fn downgrade_eof<T: Default>(r: io::Result<T>) -> io::Result<T> {
	match decode_eof(r) {
		Err(e) if e.kind() == BrokenPipe => Ok(T::default()),
		els => els,
	}
}