use {
crate::*,
anyhow::*,
serde::{
Deserialize,
Serialize,
},
std::process::ExitStatus,
};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum CommandResult {
Report(Report),
Failure(Failure),
None,
}
impl CommandResult {
pub fn build(
output: CommandOutput,
exit_status: ExitStatus,
mut report: Report,
) -> Result<Self> {
let error_code = exit_status.code().filter(|&c| c != 0);
debug!("report stats: {:?}", &report.stats);
if let Some(error_code) = error_code {
let stats = &report.stats;
if stats.errors + stats.test_fails + stats.warnings == 0 {
let suggest_backtrace = report.suggest_backtrace;
return Ok(Self::Failure(Failure {
error_code,
output,
suggest_backtrace,
}));
}
}
report.output = output;
report.error_code = error_code;
Ok(Self::Report(report))
}
pub fn output(&self) -> Option<&CommandOutput> {
match self {
Self::Report(report) => Some(&report.output),
Self::Failure(failure) => Some(&failure.output),
Self::None => None,
}
}
pub fn report(&self) -> Option<&Report> {
match self {
Self::Report(report) => Some(report),
_ => None,
}
}
pub fn report_mut(&mut self) -> Option<&mut Report> {
match self {
Self::Report(report) => Some(report),
_ => None,
}
}
pub fn suggest_backtrace(&self) -> bool {
match self {
Self::Report(report) => report.suggest_backtrace,
Self::Failure(failure) => failure.suggest_backtrace,
Self::None => false,
}
}
pub fn is_success(&self) -> bool {
match self {
Self::Report(report) => {
report.stats.errors + report.stats.warnings + report.stats.test_fails == 0
}
_ => false,
}
}
pub fn reverse(&mut self) {
match self {
Self::Report(report) => {
report.reverse();
}
Self::Failure(failure) => {
failure.output.reverse();
}
Self::None => {}
}
}
pub fn lines_len(&self) -> usize {
match self {
Self::Report(report) => report.lines.len(),
Self::Failure(failure) => failure.output.lines.len(),
Self::None => 0,
}
}
}