27 lines
1.2 KiB
Text
27 lines
1.2 KiB
Text
|
|
# Configuration merging helper functions
|
||
|
|
# NUSHELL 0.109 COMPLIANT - Using reduce --fold (Rule 3), no mutable variables
|
||
|
|
|
||
|
|
# Deep merge two configuration records (right takes precedence)
|
||
|
|
# Uses reduce --fold instead of mutable variables (Nushell 0.109 Rule 3)
|
||
|
|
export def deep-merge [
|
||
|
|
base: record
|
||
|
|
override: record
|
||
|
|
]: record -> record {
|
||
|
|
$override | columns | reduce --fold $base {|key, result|
|
||
|
|
let override_value = ($override | get $key)
|
||
|
|
let base_result = (do { $base | get $key } | complete)
|
||
|
|
let base_value = if $base_result.exit_code == 0 { $base_result.stdout } else { null }
|
||
|
|
|
||
|
|
if ($base_value | is-empty) {
|
||
|
|
# Key doesn't exist in base, add it
|
||
|
|
($result | insert $key $override_value)
|
||
|
|
} else if (($base_value | describe) | str starts-with "record") and (($override_value | describe) | str starts-with "record") {
|
||
|
|
# Both are records, merge recursively (Nushell Rule 1: type detection via describe)
|
||
|
|
($result | upsert $key (deep-merge $base_value $override_value))
|
||
|
|
} else {
|
||
|
|
# Override the value
|
||
|
|
($result | upsert $key $override_value)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|