pub mod capture;
use std::process::ExitStatus;
use std::time::Duration;
pub use self::capture::Capture;
use crate::error::RequireSuccessError;
use crate::invocation::Invocation;
use crate::process_id::ProcessId;
#[derive(Clone, Eq, PartialEq, Debug)]
pub struct Execution {
invocation: Invocation,
id: Option<ProcessId>,
status: ExitStatus,
stdout: Capture,
stderr: Capture,
duration: Duration,
}
impl Execution {
pub fn new(
invocation: Invocation,
id: Option<ProcessId>,
status: ExitStatus,
stdout: Capture,
stderr: Capture,
duration: Duration,
) -> Self {
Self {
invocation,
id,
status,
stdout,
stderr,
duration,
}
}
pub fn duration(&self) -> Duration {
self.duration
}
pub fn id(&self) -> Option<ProcessId> {
self.id
}
pub fn invocation(&self) -> &Invocation {
&self.invocation
}
pub fn require_success(self) -> Result<Self, RequireSuccessError> {
if self.status.success() {
Ok(self)
} else {
Err(RequireSuccessError::UnsuccessfulCommand {
invocation: self.invocation,
status: self.status,
stderr: self.stderr,
})
}
}
pub fn status(&self) -> ExitStatus {
self.status
}
pub fn stderr(&self) -> &Capture {
&self.stderr
}
pub fn stdout(&self) -> &Capture {
&self.stdout
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::missing_panics_doc)]
use super::*;
#[test]
fn execution_is_send_and_sync() {
fn assert_send_and_sync<T: Send + Sync>() {}
assert_send_and_sync::<Execution>();
}
}