Private/Test-AzLocalNotFoundError.ps1

Function Test-AzLocalNotFoundError {
    <#
    .SYNOPSIS
        Determines whether an Azure error represents a genuine HTTP 404.
    .DESCRIPTION
        Uses exact ARM error codes and HTTP status values instead of broad message
        fragments that can misclassify subscription, authorization, or context errors.
    #>


    [OutputType([bool])]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [System.Management.Automation.ErrorRecord]$ErrorRecord,

        [Parameter(Mandatory = $false)]
        [string[]]$ErrorCode = @('ResourceNotFound')
    )

    $signals = @([string]$ErrorRecord.FullyQualifiedErrorId, [string]$ErrorRecord.Exception.Message)
    if ($ErrorRecord.PSObject.Properties['ErrorDetails'] -and $ErrorRecord.ErrorDetails -and
        $ErrorRecord.ErrorDetails.PSObject.Properties['Message']) {
        $signals += [string]$ErrorRecord.ErrorDetails.Message
    }
    if ($ErrorRecord.Exception.PSObject.Properties['Body'] -and $ErrorRecord.Exception.Body -and
        $ErrorRecord.Exception.Body.PSObject.Properties['Code']) {
        $signals += [string]$ErrorRecord.Exception.Body.Code
    }

    foreach ($code in $ErrorCode) {
        $codePattern = '(?i)(?<![A-Za-z0-9]){0}(?![A-Za-z0-9])' -f [regex]::Escape($code)
        if (@($signals | Where-Object { $_ -match $codePattern }).Count -gt 0) {
            return $true
        }
    }

    $statusOwners = @($ErrorRecord.Exception)
    if ($ErrorRecord.Exception.PSObject.Properties['Response'] -and $ErrorRecord.Exception.Response) {
        $statusOwners += $ErrorRecord.Exception.Response
    }
    foreach ($statusOwner in $statusOwners) {
        if ($statusOwner -and $statusOwner.PSObject.Properties['StatusCode']) {
            try {
                if ([int]$statusOwner.StatusCode -eq 404) { return $true }
            } catch {
                Write-Verbose "Unable to parse Azure response status code '$($statusOwner.StatusCode)'."
            }
        }
    }

    return $false
}