Utilities/Move-PathInDictionary.ps1

function Move-PathInDictionary {
    param (
        [Parameter(Mandatory)] $Dictionary,
        [Parameter(Mandatory)] [string]$SourcePath,
        [Parameter(Mandatory)] [string]$DestinationPath
    )

    $signal = [Signal]::Start("Move-PathInDictionary", $Dictionary)

    # Step 1: Resolve source value
    $sourceSignal = Resolve-PathFromDictionary -Dictionary $Dictionary -Path $SourcePath -IgnoreInternalObjects:$IgnoreInternalObjects -SkipFinalInternalUnwrap:$SkipFinalInternalUnwrap
    if ($signal.MergeSignalAndVerifyFailure($sourceSignal)) {
        return $signal.LogCritical("Failed to resolve source at '$SourcePath'")
    }

    $valueToMove = $sourceSignal.GetResult()

    # Step 2: Add to destination
    $addSignal = Add-PathToDictionary -Dictionary $Dictionary -Path $DestinationPath -Value $valueToMove
    if ($signal.MergeSignalAndVerifyFailure($addSignal)) {
        return $signal.LogCritical("Failed to add value to destination path '$DestinationPath'")
    }

    # Step 3: Remove source (if destination write succeeded)
    $removeSignal = Remove-PathFromDictionary -Dictionary $Dictionary -Path $SourcePath -IgnoreInternalObjects:$IgnoreInternalObjects -SkipFinalInternalUnwrap:$SkipFinalInternalUnwrap
    $signal.MergeSignal($removeSignal)

    if ($removeSignal.Failure()) {
        $signal.LogWarning("Move succeeded but could not remove original at '$SourcePath'")
    } else {
        $signal.LogInformation("🔀 Successfully moved value from '$SourcePath' to '$DestinationPath'")
    }

    $signal.SetResult($Dictionary)
    return $signal
}