use std::os::fd::AsFd;
use rustix::io::read;
use rustix::io::write;
use rustix::pipe::pipe;
use crate::AsBorrowedDescriptor;
use crate::AsRawDescriptor;
use crate::FromRawDescriptor;
use crate::MesaResult;
use crate::OwnedDescriptor;
use crate::RawDescriptor;
pub struct ReadPipe {
descriptor: OwnedDescriptor,
}
pub struct WritePipe {
descriptor: OwnedDescriptor,
}
pub fn create_pipe() -> MesaResult<(ReadPipe, WritePipe)> {
let (read_pipe, write_pipe) = pipe()?;
Ok((
ReadPipe {
descriptor: read_pipe.into(),
},
WritePipe {
descriptor: write_pipe.into(),
},
))
}
impl ReadPipe {
pub fn read(&self, data: &mut [u8]) -> MesaResult<usize> {
let bytes_read = read(&self.descriptor, data)?;
Ok(bytes_read)
}
}
impl AsBorrowedDescriptor for ReadPipe {
fn as_borrowed_descriptor(&self) -> &OwnedDescriptor {
&self.descriptor
}
}
impl WritePipe {
pub fn new(descriptor: RawDescriptor) -> WritePipe {
let owned = unsafe { OwnedDescriptor::from_raw_descriptor(descriptor) };
WritePipe { descriptor: owned }
}
pub fn write(&self, data: &[u8]) -> MesaResult<usize> {
let bytes_written = write(self.descriptor.as_fd(), data)?;
Ok(bytes_written)
}
}
impl AsBorrowedDescriptor for WritePipe {
fn as_borrowed_descriptor(&self) -> &OwnedDescriptor {
&self.descriptor
}
}
impl AsRawDescriptor for WritePipe {
fn as_raw_descriptor(&self) -> RawDescriptor {
self.descriptor.as_raw_descriptor()
}
}