use crate::views::{FilelikeView, FilelikeViewType, SocketlikeView, SocketlikeViewType};
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
use crate::{AsFd, BorrowedFd, OwnedFd};
#[cfg(windows)]
use crate::{AsHandle, AsSocket, BorrowedHandle, BorrowedSocket, OwnedHandle, OwnedSocket};
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type BorrowedFilelike<'filelike> = BorrowedFd<'filelike>;
#[cfg(windows)]
pub type BorrowedFilelike<'filelike> = BorrowedHandle<'filelike>;
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type BorrowedSocketlike<'socketlike> = BorrowedFd<'socketlike>;
#[cfg(windows)]
pub type BorrowedSocketlike<'socketlike> = BorrowedSocket<'socketlike>;
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type OwnedFilelike = OwnedFd;
#[cfg(windows)]
pub type OwnedFilelike = OwnedHandle;
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub type OwnedSocketlike = OwnedFd;
#[cfg(windows)]
pub type OwnedSocketlike = OwnedSocket;
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait AsFilelike: AsFd {
fn as_filelike(&self) -> BorrowedFilelike<'_>;
fn as_filelike_view<Target: FilelikeViewType>(&self) -> FilelikeView<'_, Target>;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: AsFd> AsFilelike for T {
#[inline]
fn as_filelike(&self) -> BorrowedFilelike<'_> {
self.as_fd()
}
#[inline]
fn as_filelike_view<Target: FilelikeViewType>(&self) -> FilelikeView<'_, Target> {
FilelikeView::new(self)
}
}
#[cfg(windows)]
pub trait AsFilelike: AsHandle {
fn as_filelike(&self) -> BorrowedFilelike<'_>;
fn as_filelike_view<Target: FilelikeViewType>(&self) -> FilelikeView<'_, Target>;
}
#[cfg(windows)]
impl<T: AsHandle> AsFilelike for T {
#[inline]
fn as_filelike(&self) -> BorrowedFilelike<'_> {
self.as_handle()
}
#[inline]
fn as_filelike_view<Target: FilelikeViewType>(&self) -> FilelikeView<'_, Target> {
FilelikeView::new(self)
}
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait AsSocketlike: AsFd {
fn as_socketlike(&self) -> BorrowedSocketlike<'_>;
fn as_socketlike_view<Target: SocketlikeViewType>(&self) -> SocketlikeView<'_, Target>;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: AsFd> AsSocketlike for T {
#[inline]
fn as_socketlike(&self) -> BorrowedSocketlike<'_> {
self.as_fd()
}
#[inline]
fn as_socketlike_view<Target: SocketlikeViewType>(&self) -> SocketlikeView<'_, Target> {
SocketlikeView::new(self)
}
}
#[cfg(windows)]
pub trait AsSocketlike: AsSocket {
fn as_socketlike(&self) -> BorrowedSocketlike<'_>;
fn as_socketlike_view<Target: SocketlikeViewType>(&self) -> SocketlikeView<'_, Target>;
}
#[cfg(windows)]
impl<T: AsSocket> AsSocketlike for T {
#[inline]
fn as_socketlike(&self) -> BorrowedSocketlike<'_> {
self.as_socket()
}
#[inline]
fn as_socketlike_view<Target: SocketlikeViewType>(&self) -> SocketlikeView<'_, Target> {
SocketlikeView::new(self)
}
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait IntoFilelike: Into<OwnedFd> {
fn into_filelike(self) -> OwnedFilelike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: Into<OwnedFd>> IntoFilelike for T {
#[inline]
fn into_filelike(self) -> OwnedFilelike {
self.into()
}
}
#[cfg(windows)]
pub trait IntoFilelike: Into<OwnedHandle> {
fn into_filelike(self) -> OwnedFilelike;
}
#[cfg(windows)]
impl<T: Into<OwnedHandle>> IntoFilelike for T {
#[inline]
fn into_filelike(self) -> OwnedFilelike {
self.into()
}
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait IntoSocketlike: Into<OwnedFd> {
fn into_socketlike(self) -> OwnedSocketlike;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: Into<OwnedFd>> IntoSocketlike for T {
#[inline]
fn into_socketlike(self) -> OwnedSocketlike {
self.into()
}
}
#[cfg(windows)]
pub trait IntoSocketlike: Into<OwnedSocket> {
fn into_socketlike(self) -> OwnedSocketlike;
}
#[cfg(windows)]
impl<T: Into<OwnedSocket>> IntoSocketlike for T {
#[inline]
fn into_socketlike(self) -> OwnedSocketlike {
self.into()
}
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait FromFilelike: From<OwnedFd> {
fn from_filelike(owned: OwnedFilelike) -> Self;
fn from_into_filelike<Owned: IntoFilelike>(owned: Owned) -> Self;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: From<OwnedFd>> FromFilelike for T {
#[inline]
fn from_filelike(owned: OwnedFilelike) -> Self {
Self::from(owned)
}
#[inline]
fn from_into_filelike<Owned: IntoFilelike>(owned: Owned) -> Self {
Self::from_filelike(owned.into_filelike())
}
}
#[cfg(windows)]
pub trait FromFilelike: From<OwnedHandle> {
fn from_filelike(owned: OwnedFilelike) -> Self;
fn from_into_filelike<Owned: IntoFilelike>(owned: Owned) -> Self;
}
#[cfg(windows)]
impl<T: From<OwnedHandle>> FromFilelike for T {
#[inline]
fn from_filelike(owned: OwnedFilelike) -> Self {
Self::from(owned)
}
#[inline]
fn from_into_filelike<Owned: IntoFilelike>(owned: Owned) -> Self {
Self::from_filelike(owned.into_filelike())
}
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
pub trait FromSocketlike: From<OwnedFd> {
fn from_socketlike(owned: OwnedSocketlike) -> Self;
fn from_into_socketlike<Owned: IntoSocketlike>(owned: Owned) -> Self;
}
#[cfg(any(unix, target_os = "wasi", target_os = "hermit"))]
impl<T: From<OwnedFd>> FromSocketlike for T {
#[inline]
fn from_socketlike(owned: OwnedSocketlike) -> Self {
Self::from(owned)
}
#[inline]
fn from_into_socketlike<Owned: IntoSocketlike>(owned: Owned) -> Self {
Self::from_socketlike(owned.into_socketlike())
}
}
#[cfg(windows)]
pub trait FromSocketlike: From<OwnedSocket> {
fn from_socketlike(owned: OwnedSocketlike) -> Self;
fn from_into_socketlike<Owned: IntoSocketlike>(owned: Owned) -> Self;
}
#[cfg(windows)]
impl<T: From<OwnedSocket>> FromSocketlike for T {
#[inline]
fn from_socketlike(owned: OwnedSocketlike) -> Self {
Self::from(owned)
}
#[inline]
fn from_into_socketlike<Owned: IntoSocketlike>(owned: Owned) -> Self {
Self::from_socketlike(owned.into_socketlike())
}
}