Private/New-ArmorApiUriQueryString.ps1

Function New-ArmorApiUriQueryString
{
    <#
        .SYNOPSIS
        The New-ArmorApiUriQueryString function is used to build a valid URI query string.

        .DESCRIPTION
        { required: more detailed description of the function's purpose }

        .NOTES
        Troy Lindsay
        Twitter: @troylindsay42
        GitHub: tlindsay42

        .PARAMETER QueryKeys
        All of the query options available to the endpoint.

        .PARAMETER Parameters
        All of the parameter options available within the parent function.

        .PARAMETER Uri
        The endpoint's URI.

        .INPUTS
        { required: .NET Framework object types that can be piped in and a description of the input objects }

        .OUTPUTS
        { required: .NET Framework object types that the cmdlet returns and a description of the returned objects }

        .LINK
        https://github.com/tlindsay42/ArmorPowerShell

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

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

        .EXAMPLE
        {required: show one or more examples using the function}
    #>


    Param
    (
        [Parameter( Position = 0 )]
        [String[]] $QueryKeys = @(),
        [Parameter( Position = 1 )]
        [ValidateNotNullOrEmpty()]
        [String[]] $Parameters = @(),
        [Parameter( Position = 2 )]
        [ValidateNotNullOrEmpty()]
        [String] $Uri = ''
    )

    Begin
    {
        # The Begin section is used to perform one-time loads of data necessary to carry out the function's purpose
        # If a command needs to be run with each iteration or pipeline input, place it in the Process section

        $function = $MyInvocation.MyCommand.Name

        Write-Verbose -Message ( 'Beginning {0}.' -f $function )
    } # End of Begin

    Process
    {
        $return = $Uri

        Write-Verbose -Message 'Build the query parameters.'

        $queryString = @()

        # Walk through all of the available query options presented by the endpoint
        # Note: Keys are used to search in case the value changes in the future across different API versions
        ForEach ( $query In $QueryKeys )
        {
            # Walk through all of the parameters defined in the function
            # Both the parameter name and parameter alias are used to match against a query option
            # It is suggested to make the parameter name "human friendly" and set an alias corresponding to the query option name
            ForEach ( $parameter In $Parameters )
            {
                # If the parameter name matches the query option name, build a query string
                If ( $parameter.Name -eq $query )
                {
                    If ( $resources.Query[$parameter.Name] -and ( Get-Variable -Name $parameter.Name ).Value )
                    {
                        $queryString += '{0}={1}' -f $resources.Query[$parameter.Name], ( Get-Variable -Name $parameter.Name ).Value
                    }
                }
                # If the parameter alias matches the query option name, build a query string
                ElseIf ( $parameter.Aliases -eq $query )
                {
                    If ( $resources.Query[$parameter.Aliases] -and ( Get-Variable -Name $parameter.Name ).Value )
                    {
                        $queryString += '{0}={1}' -f $resources.Query[$parameter.Aliases], ( Get-Variable -Name $parameter.Name ).Value
                    }
                }
            }
        }

        # After all query options are exhausted, build a new URI with all defined query options
        If ( $queryString.Count -gt 0 )
        {
            $return = '?{0}' -f ( $queryString -join '&' )

            Write-Verbose -Message ( 'URI = {0}' -f $return )
        }

        Return $return
    } # End of Process

    End
    {
        Write-Verbose -Message ( 'Ending {0}.' -f $function )
    } # End of End
} # End of Function