functions/azure/azcli/Invoke-AzCliRestCommand.ps1

# <copyright file="Invoke-AzCliRestCommand.ps1" company="Endjin Limited">
# Copyright (c) Endjin Limited. All rights reserved.
# </copyright>

<#
.SYNOPSIS
Provides a wrapper around the 'az rest' command included with the azure-cli.

.DESCRIPTION
Provides a wrapper around the 'az rest' command included with the azure-cli, handling all the necessary JSON escaping.

.PARAMETER Uri
The Uri of the request to be invoked.

.PARAMETER Method
The REST method of the request to be invoked.

.PARAMETER Body
The body of the request to be invoked.

.PARAMETER Headers
The HTTP headers required by the request to be invoked.

.OUTPUTS
The JSON output from the underlying azure-cli command, in hashtable format.

#>


function Invoke-AzCliRestCommand
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string] $Uri,
        
        [Parameter()]
        [ValidateSet("DELETE", "GET", "PATCH", "POST", "PUT")]
        [string] $Method = "GET",
        
        [Parameter()]
        [hashtable] $Body,
        
        [Parameter()]
        [hashtable] $Headers
    )

    if (@("GET", "DELETE") -contains $Method) {
        $uriEscaped = $Uri.Replace("'", "''")

        $response = Invoke-AzCli -Command "rest --uri '$uriEscaped' --method '$Method'" -AsJson

        return $response
    }
    else {
        $bodyAsEscapedJsonString = (ConvertTo-Json $Body -Depth 30 -Compress).replace('"', '\"').replace(':\', ': \').replace("'", "''")
        $headersAsEscapedJsonString = (ConvertTo-Json $Headers -Compress).replace('"', '\"').replace(':\', ': \').replace("'", "''")

        $response = Invoke-AzCli -Command "rest --uri '$Uri' --method '$Method' --body '$bodyAsEscapedJsonString' --headers '$headersAsEscapedJsonString'" -AsJson

        return $response
    }
}