use crate::exit::ExitCode;
use crate::output::{StartupStep, StartupSteps, Streams, emit, write_outcome};
pub(crate) const OK: &str = "ok";
pub(crate) const ABSENT: &str = "absent";
#[derive(Debug)]
pub(crate) struct Refusal {
pub(crate) code: ExitCode,
pub(crate) message: String,
}
pub(crate) fn report(
streams: &mut Streams<'_>,
command: &str,
steps: Vec<StartupStep>,
) -> ExitCode {
let failed = steps
.iter()
.any(|step| step.result != OK && step.result != ABSENT);
let written = write_outcome(emit(
&mut *streams.out,
streams.fmt,
command,
StartupSteps(steps),
streams.style,
));
if failed { ExitCode::Failure } else { written }
}
pub(crate) fn failure_line(output: &std::process::Output) -> String {
let stderr = String::from_utf8_lossy(&output.stderr);
stderr
.lines()
.map(str::trim)
.find(|line| !line.is_empty())
.map_or_else(|| format!("failed: {}", output.status), ToString::to_string)
}
pub(crate) fn xml_text(value: &str) -> String {
value
.replace('&', "&")
.replace('<', "<")
.replace('>', ">")
}