183 lines
6.3 KiB
Plaintext

# Help renderer - Formats help content with consistent styling
# Converts structured help data into formatted output with ANSI colors
# Render header with title and color
export def render-header [title: string, color: string] {
let color_code = (match $color {
"cyan" => (_ansi cyan_bold)
"purple" => (_ansi purple_bold)
"blue" => (_ansi blue_bold)
"green" => (_ansi green_bold)
"red" => (_ansi red_bold)
"magenta" => (_ansi magenta_bold)
"yellow" => (_ansi yellow_bold)
_ => (_ansi white_bold)
})
let reset = (_ansi reset)
let line1 = $"($color_code)╔══════════════════════════════════════════════════╗($reset)\n"
let line2 = $"($color_code)║($reset) $title($color_code) ║($reset)\n"
let line3 = $"($color_code)╚══════════════════════════════════════════════════╝($reset)\n\n"
$line1 + $line2 + $line3
}
# Render section header with category
export def render-section-header [name: string, subtitle: string] {
let header = $"(_ansi green_bold)[$name](_ansi reset) "
let sub = if ($subtitle | str length) > 0 { $subtitle } else { "" }
$header + $sub + "\n"
}
# Render command line
export def render-command-line [cmd: string, desc: string] {
let cmd_part = $" (_ansi blue)$cmd(_ansi reset)"
let desc_part = if ($desc | str length) > 0 {
$" - $desc"
} else {
""
}
$cmd_part + $desc_part + "\n"
}
# Render flag line (for flags section)
export def render-flag-line [flag: string, desc: string] {
$" (_ansi cyan)$flag(_ansi reset) - $desc\n"
}
# Render feature item (bullet point)
export def render-feature [feature: string] {
$" • (_ansi green)$feature(_ansi reset)\n"
}
# Render a complete section from structured data
export def render-section [section: record] {
let name = $section.name? | default ""
let subtitle = $section.subtitle? | default ""
let items = $section.items? | default []
let content = $section.content? | default ""
let features = $section.features? | default []
let note = $section.note? | default ""
let header = if ($name | str length) > 0 {
(render-section-header $name $subtitle)
} else {
""
}
let items_output = if ($items | length) > 0 {
$items
| each { |item|
if ("cmd" in $item) {
(render-command-line $item.cmd ($item.desc? | default ""))
} else if ("flag" in $item) {
(render-flag-line $item.flag ($item.desc? | default ""))
} else if ("step" in $item) {
let step_prefix = $" (_ansi cyan)($item.step)(_ansi reset) "
let step_val = if ("cmd" in $item) { $item.cmd } else { $item.note? | default "" }
$step_prefix + $step_val + "\n"
} else if ("level" in $item) {
let level_prefix = $" (_ansi yellow)($item.level)(_ansi reset): "
let level_val = $item.desc? | default ""
$level_prefix + $level_val + "\n"
} else {
""
}
}
| str join ""
} else {
""
}
let content_output = if ($content | str length) > 0 {
$content + "\n\n"
} else {
""
}
let features_output = if ($features | length) > 0 {
$features
| each { |feature| (render-feature $feature) }
| str join ""
} else {
""
}
let note_output = if ($note | str length) > 0 {
$"(_ansi default_dimmed)Note: $note(_ansi reset)\n\n"
} else {
""
}
$header + $items_output + $content_output + $features_output + $note_output
}
# Render complete help category with all sections
export def render-help-category [title: string, color: string, sections: list, examples: list = [], warning: string = "", tip: string = ""] {
let header = (render-header $title $color)
let sections_output = $sections
| each { |section| (render-section $section) }
| str join "\n"
let warning_output = if ($warning | str length) > 0 {
$"(_ansi yellow_bold)⚠️ ($warning)(_ansi reset)\n\n"
} else {
""
}
let examples_output = if ($examples | length) > 0 {
let ex_header = (render-section-header "Examples" "")
let ex_items = ($examples
| each { |ex| $" (_ansi green)$ex(_ansi reset)\n" }
| str join "")
$ex_header + $ex_items + "\n"
} else {
""
}
let tip_output = if ($tip | str length) > 0 {
$"(_ansi default_dimmed)💡 $tip(_ansi reset)\n"
} else {
""
}
let result1 = $header + $sections_output
let result2 = $result1 + $warning_output
let result3 = $result2 + $examples_output
$result3 + $tip_output
}
# Quick reference rendering for main help (categories list)
export def render-main-help [] {
let show_header = not ($env.PROVISIONING_NO_TITLES? | default false)
if $show_header {
let h1 = $"(_ansi yellow_bold)╔════════════════════════════════════════════════════════════════╗(_ansi reset)\n"
let h2 = $"(_ansi yellow_bold)║ (_ansi reset) (_ansi cyan_bold)PROVISIONING SYSTEM(_ansi reset) - Layered Infrastructure Automation (_ansi yellow_bold) ║(_ansi reset)\n"
let h3 = $"(_ansi yellow_bold)╚════════════════════════════════════════════════════════════════╝(_ansi reset)\n\n"
$h1 + $h2 + $h3
} else {
""
}
}
# Render command examples for guides
export def render-command-examples [examples: list] {
if ($examples | length) == 0 {
return ""
}
let header = $"(_ansi green_bold)EXAMPLES(_ansi reset)\n\n"
let items = ($examples
| each { |ex|
if ($ex | str contains " #") {
$" ($ex)\n"
} else {
$" provisioning $ex\n"
}
}
| str join "")
$header + $items + "\n"
}