# Simple, working cache implementation # Focuses on core functionality with clean Nushell patterns # Core cache operations export def cache-write [ cache_type: string # "nickel", "sops", "final", etc. cache_key: string # Unique identifier data: any # Data to cache ] { let cache_dir = (get-cache-dir $cache_type) let cache_file = $"($cache_dir)/($cache_key).json" # Create directory if needed if not ($cache_dir | path exists) { ^mkdir -p $cache_dir } # Write cache file $data | to json | save -f $cache_file } export def cache-read [ cache_type: string cache_key: string ] { let cache_file = $"(get-cache-dir $cache_type)/($cache_key).json" if ($cache_file | path exists) { open -r $cache_file | from json } else { null } } export def cache-clear [ cache_type: string = "all" ] { let cache_base = (get-cache-base) if $cache_type == "all" { ^rm -rf $cache_base } else { let type_dir = $"($cache_base)/($cache_type)" if ($type_dir | path exists) { ^rm -rf $type_dir } } } export def cache-list [ cache_type: string = "*" ] { let cache_base = (get-cache-base) if ($cache_base | path exists) { let pattern = if $cache_type == "*" { "/**/*.json" } else { $"/($cache_type)/*.json" } glob $"($cache_base)($pattern)" } else { [] } } # Configuration management export def cache-config-get [ setting: string = "enabled" ] { let config = get-cache-config # Simple dot notation support if ($setting | str contains ".") { let parts = ($setting | split row ".") mut result = $config for part in $parts { $result = ($result | get --optional $part) if ($result == null) { return null } } $result } else { $config | get --optional $setting } } export def cache-config-set [ setting: string value: any ] { let config_path = (get-config-file) let config_dir = ($config_path | path dirname) # Create config directory if needed if not ($config_dir | path exists) { ^mkdir -p $config_dir } # Load existing config or create new let config = if ($config_path | path exists) { open -r $config_path | from json } else { {} } # Set value let updated = ($config | upsert $setting $value) # Save $updated | to json | save -f $config_path } export def get-cache-config [] { let config_file = (get-config-file) if ($config_file | path exists) { open -r $config_file | from json } else { { enabled: true ttl_final_config: 300 ttl_nickel: 1800 ttl_sops: 900 ttl_provider: 600 } } } # Status display export def cache-status [] { let config = (get-cache-config) let cache_base = (get-cache-base) print "=== Cache Configuration ===" let enabled = ($config | get --optional enabled | default true) let ttl_final = ($config | get --optional ttl_final_config | default 300) let ttl_nickel = ($config | get --optional ttl_nickel | default 1800) let ttl_sops = ($config | get --optional ttl_sops | default 900) let ttl_provider = ($config | get --optional ttl_provider | default 600) print $"Enabled: ($enabled)" print $"TTL Final Config: ($ttl_final)s" print $"TTL Nickel: ($ttl_nickel)s" print $"TTL SOPS: ($ttl_sops)s" print $"TTL Provider: ($ttl_provider)s" print "" # Cache statistics if ($cache_base | path exists) { let files = (glob $"($cache_base)/**/*.json" | where {|f| not ($f | str ends-with ".meta")}) print "=== Cache Statistics ===" print $"Total cached items: ($files | length)" print $"Cache location: ($cache_base)" } else { print "Cache not initialized yet" } } # Helper functions def get-cache-base [] { let home = ($env.HOME | default "") $"($home)/.provisioning/cache/config" } def get-cache-dir [cache_type: string] { $"(get-cache-base)/($cache_type)" } def get-config-file [] { $"(get-cache-base)/settings.json" }