use super::Result;
use super::file_system::OfdAccess;
use crate::io::Fd;
use enumset::{EnumSet, EnumSetType};
use std::rc::Rc;
#[derive(Debug, EnumSetType, Hash)]
#[non_exhaustive]
pub enum FdFlag {
CloseOnExec,
}
pub trait Close {
fn close(&self, fd: Fd) -> Result<()>;
}
impl<S: Close> Close for Rc<S> {
#[inline]
fn close(&self, fd: Fd) -> Result<()> {
(self as &S).close(fd)
}
}
pub trait Pipe {
fn pipe(&self) -> Result<(Fd, Fd)>;
}
impl<S: Pipe> Pipe for Rc<S> {
#[inline]
fn pipe(&self) -> Result<(Fd, Fd)> {
(self as &S).pipe()
}
}
pub trait Dup {
fn dup(&self, from: Fd, to_min: Fd, flags: EnumSet<FdFlag>) -> Result<Fd>;
fn dup2(&self, from: Fd, to: Fd) -> Result<Fd>;
}
impl<S: Dup> Dup for Rc<S> {
#[inline]
fn dup(&self, from: Fd, to_min: Fd, flags: EnumSet<FdFlag>) -> Result<Fd> {
(self as &S).dup(from, to_min, flags)
}
#[inline]
fn dup2(&self, from: Fd, to: Fd) -> Result<Fd> {
(self as &S).dup2(from, to)
}
}
pub trait Fcntl {
fn ofd_access(&self, fd: Fd) -> Result<OfdAccess>;
fn get_and_set_nonblocking(&self, fd: Fd, nonblocking: bool) -> Result<bool>;
fn fcntl_getfd(&self, fd: Fd) -> Result<EnumSet<FdFlag>>;
fn fcntl_setfd(&self, fd: Fd, flags: EnumSet<FdFlag>) -> Result<()>;
}
impl<S: Fcntl> Fcntl for Rc<S> {
#[inline]
fn ofd_access(&self, fd: Fd) -> Result<OfdAccess> {
(self as &S).ofd_access(fd)
}
#[inline]
fn get_and_set_nonblocking(&self, fd: Fd, nonblocking: bool) -> Result<bool> {
(self as &S).get_and_set_nonblocking(fd, nonblocking)
}
#[inline]
fn fcntl_getfd(&self, fd: Fd) -> Result<EnumSet<FdFlag>> {
(self as &S).fcntl_getfd(fd)
}
#[inline]
fn fcntl_setfd(&self, fd: Fd, flags: EnumSet<FdFlag>) -> Result<()> {
(self as &S).fcntl_setfd(fd, flags)
}
}
pub trait Read {
fn read<'a>(
&self,
fd: Fd,
buffer: &'a mut [u8],
) -> impl Future<Output = Result<usize>> + use<'a, Self>;
}
impl<S: Read> Read for Rc<S> {
#[inline]
fn read<'a>(
&self,
fd: Fd,
buffer: &'a mut [u8],
) -> impl Future<Output = Result<usize>> + use<'a, S> {
(self as &S).read(fd, buffer)
}
}
pub trait Write {
fn write<'a>(
&self,
fd: Fd,
buffer: &'a [u8],
) -> impl Future<Output = Result<usize>> + use<'a, Self>;
}
impl<S: Write> Write for Rc<S> {
#[inline]
fn write<'a>(
&self,
fd: Fd,
buffer: &'a [u8],
) -> impl Future<Output = Result<usize>> + use<'a, S> {
(self as &S).write(fd, buffer)
}
}