///|
fn write_line(builder : StringBuilder, line : String) -> Unit {
builder.write_string(line)
builder.write_string("\n")
}
///|
fn render_summary(builder : StringBuilder, report : DoctorReport) -> Unit {
write_line(builder, "Moon Doctor report")
write_line(builder, "Project: " + report.root)
write_line(builder, "Profile: " + report.profile)
write_line(builder, "Conclusion: " + report.conclusion())
write_line(
builder,
"Grade: " + report.score.grade + " (" + report.score.status + ")",
)
write_line(
builder,
"Findings: " +
"\{report.score.errors} error(s), " +
"\{report.score.warnings} warning(s), " +
"\{report.score.infos} info item(s)",
)
}
///|
fn render_diagnostics(
builder : StringBuilder,
diagnostics : Array[Diagnostic],
) -> Unit {
write_line(builder, "")
write_line(builder, "Diagnostics")
if diagnostics.length() == 0 {
write_line(builder, "- No findings.")
} else {
for item in diagnostics {
write_line(
builder,
"- [" + item.severity.label() + "] " + item.code + ": " + item.message,
)
if item.detail.length() > 0 {
write_line(builder, " " + item.detail)
}
match item.location {
Some(location) =>
write_line(
builder,
" Location: " + location.path + ":" + "\{location.line}",
)
None => ()
}
if item.remediation.length() > 0 {
write_line(builder, " Suggested fix: " + item.remediation.join(" "))
}
}
}
}
///|
fn render_next_steps(
builder : StringBuilder,
checklist : Array[String],
) -> Unit {
write_line(builder, "")
write_line(builder, "Suggested validation")
write_line(builder, "- moon check")
write_line(builder, "- moon test")
write_line(builder, "")
write_line(builder, "Release checklist")
for item in checklist {
write_line(builder, "- " + item)
}
}
///|
/// Render a report as plain text for terminals, CI logs, and README examples.
pub fn render_report(report : DoctorReport) -> String {
let builder = StringBuilder()
render_summary(builder, report)
render_diagnostics(builder, report.diagnostics)
render_next_steps(builder, report.checklist)
builder.to_string()
}