Private/New-SnowRecordUri.ps1

function New-SnowRecordUri {
    [CmdletBinding()]
    param(
        [string]$Table,
        [string]$SysId,
        [string]$Number,
        [string]$Query,
        [switch]$Schema,
        [switch]$UseNavTo,
        [psobject]$InputObject
    )

    $session = Get-SnowSession
    if ($InputObject) {
        if (-not $Table) {
            foreach ($typeName in $InputObject.PSTypeNames) {
                if ($typeName -match '^Snowplow\.Record\.(.+)$') {
                    $Table = $Matches[1]
                    break
                }
            }
        }
        if (-not $SysId -and $InputObject.PSObject.Properties['sys_id']) {
            $SysId = [string]$InputObject.sys_id
        }
        if (-not $SysId -and -not $Number -and $InputObject.PSObject.Properties['number']) {
            $Number = [string]$InputObject.number
        }
    }

    if (-not $Table -or $Table -notmatch '^[a-z0-9_]+$') {
        throw [System.ArgumentException]::new('Specify a valid -Table or pipe a Snowplow record.')
    }
    if ($Schema -and ($SysId -or $Number -or $Query)) {
        throw [System.ArgumentException]::new('-Schema cannot be combined with -SysId, -Number, or -Query.')
    }
    if ($SysId -and ($Number -or $Query)) {
        throw [System.ArgumentException]::new('-SysId cannot be combined with -Number or -Query.')
    }
    if ($Number -and $Query) {
        throw [System.ArgumentException]::new('-Number cannot be combined with -Query.')
    }

    if ($Schema) {
        $definition = @(Get-SnowRecord -Table sys_db_object -Query (New-SnowQuery -Conditions @{ name = $Table }) -Fields sys_id -Limit 1)
        if (-not $definition -or -not $definition[0].sys_id) {
            throw [System.Management.Automation.ItemNotFoundException]::new("ServiceNow table '$Table' was not found.")
        }
        if ([string]$definition[0].sys_id -notmatch '^[0-9a-fA-F]{32}$') {
            throw [System.IO.InvalidDataException]::new("ServiceNow returned an invalid sys_id for table '$Table'.")
        }
        $path = "sys_db_object.do?sys_id=$($definition[0].sys_id)"
    }
    elseif ($Number) {
        $numberQuery = New-SnowQuery -Conditions @{ number = $Number }
        $record = @(Get-SnowRecord -Table $Table -Query $numberQuery -Fields sys_id, number -Limit 1)
        if (-not $record -or -not $record[0].sys_id) {
            throw [System.Management.Automation.ItemNotFoundException]::new("No $Table record with number '$Number' was found.")
        }
        if ([string]$record[0].sys_id -notmatch '^[0-9a-fA-F]{32}$') {
            throw [System.IO.InvalidDataException]::new("ServiceNow returned an invalid sys_id for $Table record '$Number'.")
        }
        $path = "$Table.do?sys_id=$($record[0].sys_id)"
    }
    elseif ($SysId) {
        if ($SysId -notmatch '^[0-9a-fA-F]{32}$') {
            throw [System.ArgumentException]::new('-SysId must be a 32-character ServiceNow sys_id.')
        }
        $path = "$Table.do?sys_id=$SysId"
    }
    else {
        $path = "${Table}_list.do"
        if ($Query) {
            $path += "?sysparm_query=$([uri]::EscapeDataString($Query))"
        }
    }

    if ($UseNavTo) {
        $path = "nav_to.do?uri=$([uri]::EscapeDataString($path))"
    }
    [uri]::new([uri]$session.BaseUri, $path).AbsoluteUri
}