// Copyright 2026 lkdrt. Licensed under Apache-2.0.
///|
fn print_usage() -> Unit {
println(
"=======================================================================",
)
println(" MoonBit Palette Forge - Strict Parse, Theme, Audit & Export Demo")
println(
"=======================================================================",
)
println("Usage: moon run src/cli")
println("Runs a built-in workflow demo through the public facade APIs.")
println(
"=======================================================================",
)
}
///|
fn format_scale_error(error : @harmony.ScaleError) -> String {
match error {
UnsupportedStepCount(steps) => "unsupported step count " + steps.to_string()
InvalidLightnessRange(minimum, maximum) =>
"invalid lightness range " +
@core.format_decimal(minimum, 3) +
".." +
@core.format_decimal(maximum, 3)
InvalidChromaScale(scale) =>
"invalid chroma scale " + @core.format_decimal(scale, 3)
InvalidHueOffset(offset) =>
"invalid hue offset " + @core.format_decimal(offset, 3)
}
}
///|
fn format_theme_error(error : @tokens.ThemeError) -> String {
match error {
EmptyName => "empty theme or token name"
DuplicateToken(name) => "duplicate token " + name
MissingAlias(name) => "missing alias " + name
AliasCycle(name) => "alias cycle " + name
InvalidRole(role) => "invalid role " + role
}
}
///|
fn format_analysis_error(error : @analysis.AnalysisError) -> String {
match error {
InvalidBinCount => "invalid bin count"
InvalidThreshold => "invalid duplicate threshold"
}
}
///|
fn main {
print_usage()
let seed_input = "oklch(62% 0.19 258)"
let spec : @harmony.ScaleSpec = {
steps: 5,
lightness_min: 0.18,
lightness_max: 0.92,
chroma_scale: 1.0,
hue_offset: 0.0,
}
let policy : @accessibility.AuditPolicy = {
min_text_ratio: 4.5,
min_large_ratio: 3.0,
min_ui_ratio: 3.0,
min_apca: 60.0,
}
match @lib.parse_color_strict(seed_input) {
Err(error) =>
println("strict parse failed: " + @spaces.format_parse_error(error))
Ok(seed_color) => {
println("strict parse: " + seed_input + " -> " + seed_color.to_hex())
match @lib.create_scale(seed_color, spec) {
Err(error) =>
println("scale generation failed: " + format_scale_error(error))
Ok(scale) => {
println("scale colors: " + scale.colors.length().to_string())
match @lib.create_theme(seed_color, spec) {
Err(error) =>
println("theme generation failed: " + format_theme_error(error))
Ok(theme) => {
println("theme tokens: " + theme.tokens.length().to_string())
let audit = @lib.audit_palette(scale, policy)
println(
"audit summary: " +
audit.passed.to_string() +
"/" +
audit.total.to_string() +
" passed",
)
match @lib.analyze_palette(scale) {
Err(error) =>
println("analysis failed: " + format_analysis_error(error))
Ok(report) => {
println(
"analysis readability: " +
@core.format_decimal(report.readability_score, 3),
)
println(
"analysis duplicate groups: " +
report.duplicates.length().to_string(),
)
}
}
println("\nTheme CSS export:")
println(@export.export_theme_css(theme))
println("Theme JSON export:")
println(@export.export_theme_json(theme))
}
}
}
}
}
}
}