provisioning-core/nulib/cli/handlers/workspace.nu

99 lines
2.8 KiB
Text
Raw Normal View History

#!/usr/bin/env nu
#
# Workspace LibreCloud - Development Environment Loader
# Usage: nu workspace.nu export | jq
# nu workspace.nu validate
# nu workspace.nu typecheck
use tools/nickel/process.nu [ncl-eval, ncl-eval-soft]
def main [cmd: string = "export"] {
match $cmd {
"export" => { workspace-export }
"validate" => { workspace-validate }
"typecheck" => { workspace-typecheck }
_ => {
print "Unknown command: $cmd"
print ""
print "Usage:"
print " nu workspace.nu export - Export workspace configuration as JSON"
print " nu workspace.nu validate - Validate workspace configuration"
print " nu workspace.nu typecheck - Type-check all Nickel files"
exit 1
}
}
}
# Export workspace configuration
def workspace-export [] {
let root_dir = (pwd)
let nickel_main = $"($root_dir)/nickel/main.ncl"
# For development, we create a temporary wrapper that handles imports
# The workspace entry point uses relative imports which don't work in Nickel
# So we'll use the provisioning main directly with workspace extensions
# Read provisioning main (which has all schema definitions)
let provisioning_path = ($root_dir | path join "../../provisioning/nickel/main.ncl")
let provisioning = (ncl-eval $provisioning_path [])
# Build the complete workspace structure by composing configs
let wuji_main = (ncl-eval-soft ($root_dir | path join "nickel/infra/wuji/main.ncl") [] {})
let sgoyol_main = (ncl-eval-soft ($root_dir | path join "nickel/infra/sgoyol/main.ncl") [] {})
# Return aggregated workspace
{
provisioning: $provisioning,
infrastructure: {
wuji: $wuji_main,
sgoyol: $sgoyol_main,
}
} | to json
}
# Validate workspace configuration syntax
def workspace-validate [] {
let files = (^find nickel -name "*.ncl" -type f | lines)
let file_count = ($files | length)
print $"Validating ($file_count) Nickel files..."
let errors = (
$files | each {|file|
let result = (do --ignore-errors { nickel typecheck $file } | complete)
if $result.exit_code != 0 {
{
file: $file,
error: $result.stderr,
}
}
} | compact
)
if ($errors | is-empty) {
print "✓ All files validated successfully"
} else {
print "✗ Validation errors found:"
$errors | each {|e| print $" ($e.file): ($e.error)" }
exit 1
}
}
# Type-check all Nickel files
def workspace-typecheck [] {
let files = (^find nickel -name "*.ncl" -type f | lines)
let file_count = ($files | length)
print $"Type-checking ($file_count) Nickel files..."
$files | each {|file|
let result = (do --ignore-errors { nickel typecheck $file } | complete)
if $result.exit_code != 0 {
print $" ✗ ($file)"
print $" ($result.stderr)"
} else {
print $" ✓ ($file)"
}
}
}