use crate::cli::OutputFormat;
use crate::error::CommandError;
use arcature::system_check::SystemCheckReport;
use arcature::{FRAMEWORK_CHECKS, run_checks};
pub(crate) fn execute(format: OutputFormat) -> Result<(), CommandError> {
let slices: &[&'static [&'static dyn arcature::SystemCheck]] = &[FRAMEWORK_CHECKS];
let report = run_checks(slices);
print(&report, format)?;
if report.has_error() {
Err(CommandError::Unhealthy("system checks"))
} else {
Ok(())
}
}
fn print(report: &SystemCheckReport, format: OutputFormat) -> Result<(), serde_json::Error> {
match format {
OutputFormat::Human => {
print_human(report);
Ok(())
}
OutputFormat::Json => print_json(report),
}
}
fn print_human(report: &SystemCheckReport) {
if report.is_empty() {
println!("no system checks registered");
return;
}
for r in &report.results {
println!(
"{:<8} {:<8} {:<14} {}",
r.id, r.status, r.severity, r.description,
);
println!(" context: {}", r.context);
if let Some(hint) = &r.fix_hint {
println!(" fix: {hint}");
}
}
let errors = report
.results
.iter()
.filter(|r| r.status == arcature::CheckStatus::Fail)
.count();
println!(
"\n{} check(s): {} passed, {} failed, {} skipped",
report.len(),
report
.results
.iter()
.filter(|r| r.status == arcature::CheckStatus::Pass)
.count(),
errors,
report
.results
.iter()
.filter(|r| r.status == arcature::CheckStatus::Skip)
.count(),
);
}
fn print_json(report: &SystemCheckReport) -> Result<(), serde_json::Error> {
let view = report.to_json_view();
println!("{}", serde_json::to_string_pretty(&view)?);
Ok(())
}