#[non_exhaustive]pub enum RunError {
Spawn {
command: CmdDisplay,
source: Error,
},
NonZeroExit {
command: CmdDisplay,
status: ExitStatus,
stdout: Vec<u8>,
stderr: String,
},
Timeout {
command: CmdDisplay,
elapsed: Duration,
stdout: Vec<u8>,
stderr: String,
},
}Expand description
Error type for subprocess execution.
Distinguishes between:
Spawn: infrastructure failure (binary missing, fork failed, etc.)NonZeroExit: the command ran and reported failure via exit codeTimeout: the command was killed after exceeding its timeout
All variants carry a CmdDisplay that formats the command shell-style
for logging (with secret redaction if the command was marked .secret()).
NonZeroExit and Timeout variants carry the last 128 KiB of stdout
and stderr (capped by STREAM_SUFFIX_SIZE) — enough context to debug
most failures, bounded so a runaway process can’t blow up your error
path’s memory.
Marked #[non_exhaustive] so future variants can be added without
breaking callers. Match with a wildcard arm to handle unknown variants
defensively.
let cmd = Cmd::new("git").args(&["show", "maybe-missing-ref"]);
let maybe_bytes = match cmd.run() {
Ok(output) => Some(output.stdout),
Err(RunError::NonZeroExit { .. }) => None, // ref not found
Err(e) => return Err(e.into()), // real failure bubbles up
};Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Spawn
Failed to spawn the child process. The binary may be missing, the working directory may not exist, or the OS may have refused the fork.
NonZeroExit
The child process ran but exited non-zero. stdout/stderr carry
the last STREAM_SUFFIX_SIZE bytes captured before exit (empty
for inherited stderr/stdout).
Timeout
The child process was killed after exceeding the caller’s timeout.
elapsed records how long the process ran. stdout/stderr carry
any output collected before the kill signal.
Implementations§
Source§impl RunError
impl RunError
Sourcepub fn command(&self) -> &CmdDisplay
pub fn command(&self) -> &CmdDisplay
The command that failed, formatted for display (shell-quoted, secret-redacted).
Sourcepub fn stderr(&self) -> Option<&str>
pub fn stderr(&self) -> Option<&str>
The captured stderr suffix, if any. None for spawn failures.
Stderr is stored after lossy UTF-8 decoding — any invalid sequences
from the child appear as U+FFFD replacement characters. Callers that
truly need raw bytes should inspect the child’s stderr directly via
Cmd::spawn.
Sourcepub fn stdout(&self) -> Option<&[u8]>
pub fn stdout(&self) -> Option<&[u8]>
The captured stdout suffix, if any. None for spawn failures.
Sourcepub fn exit_status(&self) -> Option<ExitStatus>
pub fn exit_status(&self) -> Option<ExitStatus>
The exit status, if the process actually ran to completion. None for spawn failures and timeouts.
Sourcepub fn is_non_zero_exit(&self) -> bool
pub fn is_non_zero_exit(&self) -> bool
Whether this error represents a non-zero exit (the command ran and reported failure).
Sourcepub fn is_spawn_failure(&self) -> bool
pub fn is_spawn_failure(&self) -> bool
Whether this error represents a spawn failure (couldn’t start the process).
Sourcepub fn is_timeout(&self) -> bool
pub fn is_timeout(&self) -> bool
Whether this error represents a timeout (process killed after exceeding its time budget).
Trait Implementations§
Source§impl Error for RunError
impl Error for RunError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()