#!/usr/bin/env nu # prvng catalog — browse IaC building blocks in catalog/. # Lists components, providers, taskservs, clusters, and domain artifacts. export-env { let lib_dirs_raw = ($env.NU_LIB_DIRS? | default "") let current_lib_dirs = if ($lib_dirs_raw | type) == "string" { if ($lib_dirs_raw | is-empty) { [] } else { ($lib_dirs_raw | split row ":") } } else { $lib_dirs_raw } let dynamic = ($env.PROVISIONING? | default "" | path join "core" "nulib") $env.NU_LIB_DIRS = ([ "/opt/provisioning/core/nulib" "/usr/local/provisioning/core/nulib" ] | append $current_lib_dirs | append (if ($dynamic | is-not-empty) { [$dynamic] } else { [] })) } def cat-root [] { let prov = ($env.PROVISIONING? | default "") if ($prov | is-empty) { error make --unspanned { msg: "PROVISIONING env var not set" } } # Post-constellation-migration: env.nu may point to the constellation root # while the catalog lives under code/. Try direct path first, then code/ sub-repo. let direct = ($prov | path join "catalog") if ($direct | path exists) { return $direct } let via_code = ($prov | path join "code" "catalog") if ($via_code | path exists) { return $via_code } error make --unspanned { msg: $"catalog not found under ($prov) — check PROVISIONING" } } def list-catalog-dir [subdir: string]: nothing -> list { let dir = (cat-root | path join $subdir) if not ($dir | path exists) { return [] } ls $dir | where type == "dir" | get name | each { |p| $p | path basename } } def cmd-list [args: list] { let kind = $args | get 0? | default "all" let all_kinds = ["components" "providers" "taskservs" "domains" "playbooks" "workflows"] match $kind { "components" | "comp" | "c" => { let items = (list-catalog-dir "components") if ($items | is-empty) { print "No components found" } else { for n in $items { print $" ($n)" } } } "providers" | "prov" => { let items = (list-catalog-dir "providers") if ($items | is-empty) { print "No providers found" } else { for n in $items { print $" ($n)" } } } "taskservs" | "ts" => { let items = (list-catalog-dir "taskservs") if ($items | is-empty) { print "No taskservs found" } else { for n in $items { print $" ($n)" } } } "domains" => { let items = (list-catalog-dir "domains") if ($items | is-empty) { print "No local domain artifacts" } else { for n in $items { print $" ($n)" } } } "playbooks" | "pb" => { let items = (list-catalog-dir "playbooks") if ($items | is-empty) { print "No playbooks found" } else { for n in $items { print $" ($n)" } } } "workflows" | "wf" => { let items = (list-catalog-dir "workflows") if ($items | is-empty) { print "No workflows found" } else { for n in $items { print $" ($n)" } } } "all" | _ => { for k in $all_kinds { let items = (list-catalog-dir $k) if ($items | is-not-empty) { print $"($k):" $items | each { |n| print $" ($n)" } print "" } } } } } def cmd-show [args: list] { let name = $args | get 0? | default "" if ($name | is-empty) { error make --unspanned { msg: "Usage: catalog show " } } let root = (cat-root) for kind in ["components" "providers" "taskservs" "domains" "playbooks" "workflows"] { let dir = ($root | path join $kind $name) if ($dir | path exists) { print $"($kind)/($name)" for f in (ls $dir | get name) { print $" ($f | path basename)" } return } } error make --unspanned { msg: $"'($name)' not found in catalog" } } def main [...args: string]: nothing -> nothing { let cmd = $args | get 0? | default "" let rest = if ($args | length) > 1 { $args | skip 1 } else { [] } match $cmd { "catalog" | "cat" => { let sub = $rest | get 0? | default "list" let sub_rest = if ($rest | length) > 1 { $rest | skip 1 } else { [] } match $sub { "list" | "ls" => { cmd-list $sub_rest } "show" => { cmd-show $sub_rest } _ => { print "prvng catalog " print "" print "Subcommands:" print " list [components|providers|taskservs|domains|playbooks|workflows] List catalog items" print " show Show item files" } } } _ => { print "prvng catalog " print "" print "Subcommands:" print " list [components|providers|taskservs|domains|playbooks|workflows]" print " show " } } }