pub struct DrainState<F>{ /* private fields */ }Expand description
Orchestrates non-blocking process I/O.
DrainState tracks the state of stdin, stdout, and stderr pipes for a
single process. It handles the multiplexing of data between these pipes
and internal buffers.
§Example
while !drain.is_done() {
let mut events = Vec::new();
reactor.wait(&mut events, 64, -1)?;
for ev in events {
// Map event tokens to drain calls...
}
}Implementations§
Source§impl<F> DrainState<F>
impl<F> DrainState<F>
Sourcepub fn new(
stdin_fd: Option<Fd>,
stdin_buf: Option<Box<[u8]>>,
stdout_fd: Option<Fd>,
stderr_fd: Option<Fd>,
limit: usize,
early_exit: Option<F>,
) -> Result<Self, CoreError>
pub fn new( stdin_fd: Option<Fd>, stdin_buf: Option<Box<[u8]>>, stdout_fd: Option<Fd>, stderr_fd: Option<Fd>, limit: usize, early_exit: Option<F>, ) -> Result<Self, CoreError>
Initialize a new drain state for the provided descriptors.
This consumes the descriptors and sets them to non-blocking mode.
§Errors
EBADF: One of the provided file descriptors is invalid.
Sourcepub fn write_stdin(&mut self) -> Result<bool, CoreError>
pub fn write_stdin(&mut self) -> Result<bool, CoreError>
Perform a non-blocking write to stdin if pending.
Returns Ok(true) if the write buffer is empty or the descriptor is
closed.
§Errors
EPIPE: The child process closed its reading end of the pipe.EIO: Low-level I/O error.
Sourcepub fn read_fd(&mut self, is_stdout: bool) -> Result<bool, CoreError>
pub fn read_fd(&mut self, is_stdout: bool) -> Result<bool, CoreError>
Perform a non-blocking read from stdout or stderr.
Returns Ok(true) if the stream reached EOF or the early-exit condition
was met.
§Errors
EOVERFLOW: The captured output exceeded the specified limit.EIO: Low-level I/O error.
Sourcepub fn into_parts(self) -> (Vec<u8>, Vec<u8>)
pub fn into_parts(self) -> (Vec<u8>, Vec<u8>)
Consume the state and return (stdout, stderr) buffers.
Sourcepub fn output_limit_exceeded(&self) -> bool
pub fn output_limit_exceeded(&self) -> bool
Return whether the combined stdout+stderr output limit was exceeded.
Sourcepub fn stdout_early_exited(&self) -> bool
pub fn stdout_early_exited(&self) -> bool
Return whether stdout was explicitly stopped by the early-exit predicate.