///|
fn issue(severity : Severity, file : String, message : String) -> DocIssue {
{ severity, file, line: None, message }
}
///|
fn add_readme_issues(issues : Array[DocIssue], report : ProjectReport) -> Unit {
if !report.readme.found {
issues.push(issue(Warning, "README", "README file not found"))
} else {
if !report.readme.has_overview {
issues.push(
issue(Warning, "README", "README is missing project overview"),
)
}
if !report.readme.has_usage {
issues.push(
issue(Warning, "README", "README is missing documentation entry"),
)
}
if !report.readme.has_license_mention {
issues.push(
issue(Suggestion, "README", "README does not mention the license"),
)
}
}
}
///|
fn add_moon_mod_issues(
issues : Array[DocIssue],
report : ProjectReport,
) -> Unit {
if !report.moon_mod.found {
issues.push(issue(Warning, "moon.mod", "`moon.mod` file not found"))
} else {
if !report.moon_mod.has_name {
issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `name`"))
}
if !report.moon_mod.has_version {
issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `version`"))
}
if !report.moon_mod.has_license {
issues.push(issue(Warning, "moon.mod", "`moon.mod` is missing `license`"))
}
if !report.moon_mod.has_description {
issues.push(
issue(Suggestion, "moon.mod", "`moon.mod` is missing `description`"),
)
}
if !report.moon_mod.has_repository {
issues.push(
issue(Suggestion, "moon.mod", "`moon.mod` is missing `repository`"),
)
}
if !report.moon_mod.has_keywords {
issues.push(
issue(Suggestion, "moon.mod", "`moon.mod` is missing `keywords`"),
)
}
if !report.moon_mod.has_readme {
issues.push(
issue(Suggestion, "moon.mod", "`moon.mod` is missing `readme`"),
)
}
}
}
///|
fn add_ci_issues(issues : Array[DocIssue], report : ProjectReport) -> Unit {
if report.ci.workflow_files == 0 {
issues.push(
issue(
Suggestion,
".github/workflows",
"GitHub Actions workflow not found",
),
)
} else {
if !report.ci.has_moon_check {
issues.push(
issue(Warning, ".github/workflows", "CI does not run `moon check`"),
)
}
if !report.ci.has_moon_test {
issues.push(
issue(Warning, ".github/workflows", "CI does not run `moon test`"),
)
}
if !report.ci.has_moon_fmt {
issues.push(
issue(Suggestion, ".github/workflows", "CI does not run `moon fmt`"),
)
}
if !report.ci.has_moon_info {
issues.push(
issue(Suggestion, ".github/workflows", "CI does not run `moon info`"),
)
}
}
}
///|
fn add_generated_mbti_issues(
issues : Array[DocIssue],
report : ProjectReport,
) -> Unit {
if !report.has_generated_mbti {
issues.push(
issue(
Warning,
"pkg.generated.mbti",
"Generated interface summary not found; run `moon info` before publishing or review",
),
)
}
}
///|
fn add_coverage_issues(
issues : Array[DocIssue],
report : ProjectReport,
config : ScanConfig,
) -> Unit {
match config.coverage.min_public_api_coverage {
Some(minimum) =>
if report.documentation_coverage < minimum {
issues.push(
issue(
Warning,
report.project_name,
"Public API documentation coverage is below configured minimum " +
minimum.to_string() +
"%",
),
)
}
None => ()
}
}
///|
/// Build project-readiness issues from scan facts and configured rules.
pub fn project_readiness_issues(
report : ProjectReport,
config : ScanConfig,
) -> Array[DocIssue] {
let issues : Array[DocIssue] = []
if config.rules.check_readme {
add_readme_issues(issues, report)
}
if config.rules.check_moon_mod {
add_moon_mod_issues(issues, report)
}
if config.rules.check_ci {
add_ci_issues(issues, report)
}
if config.rules.check_generated_mbti {
add_generated_mbti_issues(issues, report)
}
add_coverage_issues(issues, report, config)
issues
}