Skip to main content

DrainState

Struct DrainState 

Source
pub struct DrainState<F>
where F: FnMut(&[u8]) -> bool,
{ /* 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>
where F: FnMut(&[u8]) -> bool,

Source

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>, chunk_sink: Option<ChunkSink>, ) -> Result<Self, CoreError>

Initialize a new drain state for the provided descriptors.

This consumes the descriptors and sets them to non-blocking mode. chunk_sink enables streaming mode: every retained output chunk is forwarded to the sink instead of being accumulated into the internal buffers.

§Errors
  • EBADF: One of the provided file descriptors is invalid.
Source

pub fn is_done(&self) -> bool

Returns true if all pipes have been closed or fully drained.

Source

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.
Source

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, the early-exit condition was met, or the stream is paused on a full sink queue (the caller resumes it later). In the paused case the slot is retained.

§Errors
  • EOVERFLOW: The captured output exceeded the specified limit.
  • EIO: Low-level I/O error.
Source

pub fn stdout_paused(&self) -> bool

Return whether the stdout stream is paused on a full sink queue.

Source

pub fn stderr_paused(&self) -> bool

Return whether the stderr stream is paused on a full sink queue.

Source

pub fn resume_stdout( &mut self, reactor: &mut Reactor, ) -> Result<bool, CoreError>

Re-deliver the held stdout chunk (if any) and re-register the fd when the sink has room again. Returns true when the stream is resumed, false when the sink is still full and the stream stays paused.

Source

pub fn resume_stderr( &mut self, reactor: &mut Reactor, ) -> Result<bool, CoreError>

Re-deliver the held stderr chunk (if any) and re-register the fd when the sink has room again. Returns true when the stream is resumed, false when the sink is still full and the stream stays paused.

Source

pub fn into_parts(self) -> (Vec<u8>, Vec<u8>)

Consume the state and return (stdout, stderr) buffers.

Source

pub fn output_limit_exceeded(&self) -> bool

Return whether the combined stdout+stderr output limit was exceeded.

Source

pub fn stdout_early_exited(&self) -> bool

Return whether stdout was explicitly stopped by the early-exit predicate.

Auto Trait Implementations§

§

impl<F> !RefUnwindSafe for DrainState<F>

§

impl<F> !UnwindSafe for DrainState<F>

§

impl<F> Freeze for DrainState<F>
where F: Freeze,

§

impl<F> Send for DrainState<F>
where F: Send,

§

impl<F> Sync for DrainState<F>
where F: Sync,

§

impl<F> Unpin for DrainState<F>
where F: Unpin,

§

impl<F> UnsafeUnpin for DrainState<F>
where F: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.