use std::process::Output;
use std::time::Duration;
use anyhow::Result;
use serde::{Deserialize, Serialize};
#[allow(dead_code)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct CommandResult {
pub(crate) success: bool,
pub(crate) exit_code: Option<i32>,
pub(crate) stdout: String,
pub(crate) stderr: String,
pub(crate) duration_ms: u64,
}
impl CommandResult {
#[allow(dead_code)]
pub(crate) fn ok(&self) -> Result<&Self> {
if self.success {
Ok(self)
} else {
Err(anyhow::anyhow!(
"command failed with exit code {:?}: {}",
self.exit_code,
self.stderr
))
}
}
#[allow(dead_code)]
pub(crate) fn from_output(output: &Output, duration: Duration) -> Self {
Self {
success: output.status.success(),
exit_code: output.status.code(),
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
stderr: String::from_utf8_lossy(&output.stderr).to_string(),
duration_ms: duration.as_millis() as u64,
}
}
}
#[allow(dead_code)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct CommandOutput {
pub(crate) exit_code: i32,
pub(crate) stdout: String,
pub(crate) stderr: String,
pub(crate) timed_out: bool,
#[allow(dead_code)]
pub(crate) duration: Duration,
}