//! doctor command: render the environment report, optionally with --fix. use super::*; use crate::doctor::{self, Status}; use crate::output::{print_json, status_style, Table}; use crate::runner::SystemRunner; use anyhow::Result; pub fn run(app: &App, fix: bool) -> Result { if fix { let repaired = doctor::fix(app)?; for r in &repaired { app.log.success(r); } let runner = SystemRunner::new(false, app.cli.verbose, &app.log); for r in doctor::install_missing_tools(app, &runner)? { app.log.success(r); } app.log.info("run 'am doctor' again to verify"); return Ok(0); } // The doctor report probes real tools, even under --dry-run. let runner = SystemRunner::new(false, false, &app.log); let report = doctor::run(app, &runner); if app.json() { print_json(&report.checks); return Ok(if report.ok() { 0 } else { 1 }); } let color = app.color(); let mut table = Table::new(vec!["CHECK", "STATUS", "DETAIL"]); for c in &report.checks { let status = match c.status { Status::Ok => status_style("ok", color), Status::Warn => status_style("warn", color), Status::Error => status_style("error", color), }; table.row(vec![c.name.clone(), status, c.detail.clone()]); } print!("{}", table.render()); if report.problems() > 0 { app.log .warn(&format!("{} problem(s) found — 'am doctor --fix' repairs what it can", report.problems())); } else { app.log.success("environment looks good"); } Ok(if report.ok() { 0 } else { 1 }) }