use crate::{error::Error, flags::OpenFlags, tests::traits::ErrorImpl, Handle, HandleRef};
use std::{
fs::File,
os::unix::io::{AsFd, OwnedFd},
};
pub(in crate::tests) trait HandleImpl: AsFd + std::fmt::Debug + Sized {
type Cloned: HandleImpl<Error = Self::Error> + Into<OwnedFd>;
type Error: ErrorImpl;
#[cfg_attr(not(feature = "capi"), allow(dead_code))] fn from_fd(fd: impl Into<OwnedFd>) -> Self::Cloned;
fn try_clone(&self) -> Result<Self::Cloned, anyhow::Error>;
fn reopen(&self, flags: impl Into<OpenFlags>) -> Result<File, Self::Error>;
}
impl HandleImpl for Handle {
type Cloned = Handle;
type Error = Error;
fn from_fd(fd: impl Into<OwnedFd>) -> Self::Cloned {
Self::Cloned::from_fd(fd)
}
fn try_clone(&self) -> Result<Self::Cloned, anyhow::Error> {
self.as_ref().try_clone().map_err(From::from)
}
fn reopen(&self, flags: impl Into<OpenFlags>) -> Result<File, Self::Error> {
self.as_ref().reopen(flags)
}
}
impl HandleImpl for &Handle {
type Cloned = Handle;
type Error = Error;
fn from_fd(fd: impl Into<OwnedFd>) -> Self::Cloned {
Self::Cloned::from_fd(fd)
}
fn try_clone(&self) -> Result<Self::Cloned, anyhow::Error> {
Handle::try_clone(self).map_err(From::from)
}
fn reopen(&self, flags: impl Into<OpenFlags>) -> Result<File, Self::Error> {
Handle::reopen(self, flags)
}
}
impl HandleImpl for HandleRef<'_> {
type Cloned = Handle;
type Error = Error;
fn from_fd(fd: impl Into<OwnedFd>) -> Self::Cloned {
Self::Cloned::from_fd(fd)
}
fn try_clone(&self) -> Result<Self::Cloned, anyhow::Error> {
self.try_clone().map_err(From::from)
}
fn reopen(&self, flags: impl Into<OpenFlags>) -> Result<File, Self::Error> {
self.reopen(flags)
}
}
impl HandleImpl for &HandleRef<'_> {
type Cloned = Handle;
type Error = Error;
fn from_fd(fd: impl Into<OwnedFd>) -> Self::Cloned {
Self::Cloned::from_fd(fd)
}
fn try_clone(&self) -> Result<Self::Cloned, anyhow::Error> {
HandleRef::try_clone(self).map_err(From::from)
}
fn reopen(&self, flags: impl Into<OpenFlags>) -> Result<File, Self::Error> {
HandleRef::reopen(self, flags)
}
}