provisioning-core/nulib/domain/config/context_manager.nu

140 lines
4.8 KiB
Text
Raw Permalink Normal View History

# Module: Configuration Context Manager
# Purpose: Manages workspace context, user configuration, and configuration file loading paths.
# Dependencies: None (context utility)
# Context and Workspace Management Engine
# Handles workspace tracking, user context overrides, and configuration value management
use std log
use platform/user/config.nu [get-user-config-dir get-user-config-path]
# Get active workspace from user config
# CRITICAL: This replaces get-defaults-config-path
export def get-active-workspace [] {
let user_config_dir = (get-user-config-dir)
if not ($user_config_dir | path exists) {
return null
}
# Load central user config
let user_config_path = (get-user-config-path)
if not ($user_config_path | path exists) {
return null
}
let user_config = (open $user_config_path)
# Check if active workspace is set
if ($user_config.active_workspace == null) {
null
} else {
# Find workspace in list
let workspace_name = $user_config.active_workspace
let workspace = ($user_config.workspaces | where name == $workspace_name | first)
if ($workspace | is-empty) {
null
} else {
{
name: $workspace.name
path: $workspace.path
}
}
}
}
# Apply user context overrides with proper priority
export def apply-user-context-overrides [
config: record
context: record
] {
let overrides = ($context | get -o overrides | default {})
mut result = $config
# Apply each override if present
for key in ($overrides | columns) {
let value = ($overrides | get $key)
match $key {
"debug_enabled" => { $result = ($result | upsert debug.enabled $value) }
"log_level" => { $result = ($result | upsert debug.log_level $value) }
"metadata" => { $result = ($result | upsert debug.metadata $value) }
"secret_provider" => { $result = ($result | upsert secrets.provider $value) }
"kms_mode" => { $result = ($result | upsert kms.mode $value) }
"kms_endpoint" => { $result = ($result | upsert kms.remote.endpoint $value) }
"ai_enabled" => { $result = ($result | upsert ai.enabled $value) }
"ai_provider" => { $result = ($result | upsert ai.provider $value) }
"default_provider" => { $result = ($result | upsert providers.default $value) }
}
}
# Update last_used timestamp for the workspace
let workspace_name = ($context | get -o workspace.name | default null)
if ($workspace_name | is-not-empty) {
update-workspace-last-used-internal $workspace_name
}
$result
}
# Set a configuration value using dot notation
export def set-config-value [
config: record
path: string
value: any
] {
let path_parts = ($path | split row ".")
mut result = $config
if ($path_parts | length) == 1 {
$result | upsert ($path_parts | first) $value
} else if ($path_parts | length) == 2 {
let section = ($path_parts | first)
let key = ($path_parts | last)
let section_data = ($result | get -o $section | default {})
$result | upsert $section ($section_data | upsert $key $value)
} else if ($path_parts | length) == 3 {
let section = ($path_parts | first)
let subsection = ($path_parts | get 1)
let key = ($path_parts | last)
let section_data = ($result | get -o $section | default {})
let subsection_data = ($section_data | get -o $subsection | default {})
$result | upsert $section ($section_data | upsert $subsection ($subsection_data | upsert $key $value))
} else {
# For deeper nesting, use recursive approach
set-config-value-recursive $result $path_parts $value
}
}
# Internal helper to update last_used timestamp
def update-workspace-last-used-internal [workspace_name: string] {
let user_config_dir = (get-user-config-dir)
let context_file = ($user_config_dir | path join $"ws_($workspace_name).yaml")
if ($context_file | path exists) {
let config = (open $context_file)
if ($config != null) {
let updated = ($config | upsert metadata.last_used (date now | format date "%Y-%m-%dT%H:%M:%SZ"))
$updated | to yaml | save --force $context_file
}
}
}
# Recursive helper for deep config value setting
def set-config-value-recursive [
config: record
path_parts: list
value: any
] {
if ($path_parts | length) == 1 {
$config | upsert ($path_parts | first) $value
} else {
let current_key = ($path_parts | first)
let remaining_parts = ($path_parts | skip 1)
let current_section = ($config | get -o $current_key | default {})
$config | upsert $current_key (set-config-value-recursive $current_section $remaining_parts $value)
}
}