Utilities/Resolve-PathFromDictionary.ps1
|
# ══════════════════════════════════════════════════════════════════════════════ # 📦 FUNCTION: Resolve-PathFromDictionary # 🧠 Sovereign memory path resolver with symbolic and filtered access # 🏷️ Slots: Memory | Lookup | Graph # 🛠️ Authors: Shadow PhanTom 🤖/☠️🧁👾️ • Neural Alchemist ⚗️☣️🐲 # ══════════════════════════════════════════════════════════════════════════════ function Resolve-PathFromDictionary { param ( [Parameter(Mandatory)] $Dictionary, [Parameter(Mandatory)] [string]$Path, [object]$Default, [string]$SignalLevel = "Critical", [string[]]$SignalTags = $null ) $hasDefault = $PSBoundParameters.ContainsKey('Default') $opSignal = [Signal]::Start("Resolve-PathFromDictionary", $Dictionary) | Select-Object -Last 1 try { # Comma-delimited fallback path list: # "Meta.Title,Identity.Title,Meta.Name,Identity.Name" $paths = $Path -split ',' if ($null -eq $paths -or $paths.Count -eq 0) { if ($hasDefault) { $opSignal.SetResult($Default) $opSignal.LogInformation("No paths supplied. Applying default.", $SignalTags) } else { $opSignal.LogMessage($SignalLevel, "No paths supplied.", $SignalTags) } return $opSignal } # Sentinel is used as the inner default so failed inner lookups # do not become real results. $sentinel = [pscustomobject]@{ __ResolveMultiPathSentinel = [guid]::NewGuid().ToString() } $attemptedPaths = @() if ($paths.Count -eq 1) { return Resolve-InnerPathFromDictionary -Dictionary $Dictionary -Path $Path -Default $Default -SignalLevel $SignalLevel -SignalTags $SignalTags } foreach ($candidatePath in $paths) { if ($null -eq $candidatePath) { continue } $candidatePath = $candidatePath.Trim() if ([string]::IsNullOrWhiteSpace($candidatePath)) { continue } $attemptedPaths += $candidatePath $candidateSignal = Resolve-InnerPathFromDictionary ` -Dictionary $Dictionary ` -Path $candidatePath ` -Default $sentinel ` -SignalLevel "Warning" ` -SignalTags $SignalTags | Select-Object -Last 1 if ($candidateSignal -is [Signal]) { # Merge entries from every inner attempt into the outer signal. $opSignal.MergeSignal(@($candidateSignal)) | Out-Null if ($candidateSignal.HasResult()) { $candidateResult = $candidateSignal.GetResult() # First non-sentinel, non-null result wins. if ($null -ne $candidateResult -and -not [object]::ReferenceEquals($candidateResult, $sentinel)) { $opSignal.SetResult($candidateResult) $opSignal.LogInformation("Resolved multi-path using '$candidatePath'.", $SignalTags) return $opSignal } } } else { $opSignal.LogWarning("Resolve-PathFromDictionary did not return a Signal for path '$candidatePath'.", $SignalTags) } } $message = if ($attemptedPaths.Count -gt 0) { "None of the supplied paths resolved: $($attemptedPaths -join ', ')" } else { "No usable paths were supplied." } if ($hasDefault) { $opSignal.SetResult($Default) $opSignal.LogInformation("$message Applying default.", $SignalTags) } else { $opSignal.LogMessage($SignalLevel, $message, $SignalTags) } } catch { $opSignal.LogMessage( $SignalLevel, "Exception during multi-path resolution: $_", $SignalTags, $_.Exception ) } return $opSignal } |