// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2026 clbbbb
///|
pub struct ReleaseItem {
name : String
passed : Bool
detail : String
} derive(Debug, Eq)
///|
pub fn release_item(
name : String,
passed : Bool,
detail : String,
) -> ReleaseItem {
{ name, passed, detail }
}
///|
pub fn release_checklist(
moon_mod : String,
readme : String,
paths : Array[String],
sources : Array[String],
policy : Policy,
) -> Array[ReleaseItem] {
let audit = project_audit(moon_mod, readme, paths, sources, policy)
[
release_item(
"moon.mod has package name",
audit.package_name != "unknown",
audit.package_name,
),
release_item(
"moon.mod has valid license",
audit.package_license != "" && is_valid(audit.package_license),
audit.package_license,
),
release_item(
"README mentions license",
audit.readme_ok,
if audit.readme_ok {
"ok"
} else {
"missing"
},
),
release_item(
"all source files have SPDX headers",
audit.missing_headers == 0,
audit.missing_headers.to_string() + " missing",
),
release_item(
"all SPDX headers are valid",
audit.invalid_headers == 0,
audit.invalid_headers.to_string() + " invalid",
),
release_item(
"policy allows declared licenses",
audit.policy_errors.is_empty(),
audit.policy_errors.length().to_string() + " errors",
),
]
}
///|
pub fn release_ready(
moon_mod : String,
readme : String,
paths : Array[String],
sources : Array[String],
policy : Policy,
) -> Bool {
for item in release_checklist(moon_mod, readme, paths, sources, policy) {
if !item.passed {
return false
}
}
true
}
///|
pub fn release_checklist_report(items : Array[ReleaseItem]) -> String {
let rows : Array[String] = []
for item in items {
rows.push(check_mark(item.passed) + " " + item.name + " - " + item.detail)
}
join_lines(rows)
}
///|
pub fn check_mark(passed : Bool) -> String {
if passed {
"[x]"
} else {
"[ ]"
}
}
///|
pub fn release_report(
moon_mod : String,
readme : String,
paths : Array[String],
sources : Array[String],
policy : Policy,
) -> String {
release_checklist_report(
release_checklist(moon_mod, readme, paths, sources, policy),
)
}