Private/New-ArmorApiUri.ps1

function New-ArmorApiUri {
    <#
        .SYNOPSIS
        Builds the Armor API URI with the endpoint.

        .DESCRIPTION
        Builds the Armor API URI with the appropriate endpoint for the number of IDs
        specified.

        .INPUTS
        None
            You cannot pipe input to this cmdlet.

        .NOTES
        - Troy Lindsay
        - Twitter: @troylindsay42
        - GitHub: tlindsay42

        .EXAMPLE
        New-ArmorApiUri -Server 'api.armor.com' -Port 443 -Endpoints '/auth/authorize'
        This will return 'https://api.armor.com:443/auth/authorize'.

        .EXAMPLE
        New-ArmorApiUri -Server 'api.armor.com' -Port 443 -Endpoints '/vms', '/vms/{0}' -IDs 1
        This will return 'https://api.armor.com:443/vms/1'.

        .EXAMPLE
        New-ArmorApiUri -Server 'api.armor.com' -Port 443 -Endpoint '/apps/{id}/tiers', '/apps/{id}/tiers/{id}' -IDs 1, 2
        This will return 'https://api.armor.com:443/apps/1/tiers/2'.

        .LINK
        https://tlindsay42.github.io/ArmorPowerShell/private/New-ArmorApiUri/

        .LINK
        https://github.com/tlindsay42/ArmorPowerShell/blob/master/Armor/Private/New-ArmorApiUri.ps1

        .LINK
        https://docs.armor.com/display/KBSS/Armor+API+Guide

        .LINK
        https://developer.armor.com/

        .COMPONENT
        Armor API

        .FUNCTIONALITY
        Armor API URI
    #>


    [CmdletBinding( SupportsShouldProcess = $true, ConfirmImpact = 'Low' )]
    [OutputType( [String] )]
    param (
        # Specifies the Armor API server IP address or FQDN.
        [Parameter( Position = 0 )]
        [ValidateNotNullOrEmpty()]
        [String]
        $Server = $Global:ArmorSession.Server,

        # Specifies the Armor API server port.
        [Parameter( Position = 1 )]
        [ValidateRange( 1, 65535 )]
        [UInt16]
        $Port = $Global:ArmorSession.Port,

        # Specifies the array of available endpoint paths.
        [Parameter(
            Mandatory = $true,
            Position = 2
        )]
        [ValidateScript( { $_ -match '^/' } )]
        [String[]]
        $Endpoints,

        # Specifies the positional ID values to be inserted into the path.
        [Parameter( Position = 3 )]
        [ValidateCount( 0, 2 )]
        [ValidateScript( { $_ -match '^(?:\d+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$' } )]
        [AllowEmptyCollection()]
        [String[]]
        $IDs
    )

    begin {
        $function = $MyInvocation.MyCommand.Name
        Write-Verbose -Message "Beginning: '${function}'."
    }

    process {
        Write-Verbose -Message (
            "Processing: '${function}' with ParameterSetName '$( $PSCmdlet.ParameterSetName )' and Parameters: " +
            ( $PSBoundParameters | Hide-SensitiveData | Format-Table -AutoSize | Out-String )
        )

        [String] $return = $null

        if ( $PSCmdlet.ShouldProcess( 'Build the Armor API URI' ) ) {
            Write-Verbose -Message 'Build the URI.'

            switch ( ( $IDs | Measure-Object ).Count ) {
                0 {
                    $endpoint = $Endpoints.Where( { $_ -notmatch '{id}' } )

                    if ( ( $endpoint | Measure-Object ).Count -eq 0 ) {
                        throw 'Endpoint with no ID specification not found.'
                    }
                    elseif ( ( $endpoint | Measure-Object ).Count -ne 1 ) {
                        throw 'More than one endpoint with no ID specification found.'
                    }
                    else {
                        $endpoint = $endpoint[0]
                    }

                    $return = "https://${Server}:${Port}${endpoint}"
                }

                1 {
                    $endpoint = $Endpoints.Where( { $_ -match '/{id}' -and $_ -notmatch '/{id}.*/{id}' } )

                    if ( ( $endpoint | Measure-Object ).Count -eq 0 ) {
                        throw 'Endpoint with one ID specification not found.'
                    }
                    elseif ( ( $endpoint | Measure-Object ).Count -ne 1 ) {
                        throw 'More than one endpoint with one ID specification found.'
                    }
                    else {
                        $endpoint = $endpoint[0]
                    }

                    $return = "https://${Server}:${Port}${endpoint}"

                    # Insert ID in URI string
                    $return = $return -replace '{id}', $IDs[0]
                }

                2 {
                    $endpoint = $Endpoints.Where( { $_ -match '/{id}.*/{id}' -and $_ -notmatch '/{id}.*/{id}.*/{id}' } )

                    if ( ( $endpoint | Measure-Object ).Count -eq 0 ) {
                        throw 'Endpoint with two ID specifications not found.'
                    }
                    elseif ( ( $endpoint | Measure-Object ).Count -ne 1 ) {
                        throw 'More than one endpoint with two ID specifications found.'
                    }
                    else {
                        $endpoint = $endpoint[0]
                    }

                    $return = "https://${Server}:${Port}${endpoint}"

                    # Insert first ID in URI string
                    $return = $return -replace '(.*?)/{id}(.*)', "`$1/$( $IDs[0] )`$2"

                    # Insert second ID in URI string
                    $return = $return -replace '{id}', $IDs[1]
                }
            }

            Write-Verbose -Message "URI = ${return}"
        }

        $return
    }

    end {
        Write-Verbose -Message "Ending: '${function}'."
    }
}