Private/Invoke-GistApi.ps1

Function Invoke-GistApi {
    [CmdletBinding()]
    
    Param (
        [Parameter(
            Mandatory = $false
        )]
        [HashTable] 
        $Headers = @{ },
        
        [Parameter(
            Mandatory = $true
        )]
        [String] 
        $Method,

        [Parameter(
            Mandatory = $true
        )]
        [String] 
        $RestMethod,

        [Parameter()]
        [String] 
        $Body
    )
    
    if (-not (Test-Path -Path $env:AppData\PSGist\Private\OAuthToken.xml)) {
        New-GistOAuthToken |
            Out-Null
        
        Start-Sleep -Milliseconds 2500
    }

    try {
        $oAuthToken = (Import-Clixml -Path $env:AppData\PSGist\Private\OAuthToken.xml -ErrorAction Stop).GetNetworkCredential().Password 
    } catch {
        Write-Error -Message 'Failed to decrypt OAuth Token.'
        return
    }

    $Headers.Add('Authorization', 'token {0}' -f $oAuthToken)

    $request = @{
        Headers = $Headers
        Uri = 'https://api.github.com/{0}' -f $RestMethod
        Method = $Method
        ErrorAction = 'Stop'
    }
        
    if (-not [String]::IsNullOrEmpty($Body)) { 
        $request.Body = $Body 
    }

    try {
        Invoke-RestMethod @request
    } catch {
        $message = (ConvertFrom-Json -InputObject $_.ErrorDetails.Message).message
        if ($null -ne $message) {
            throw $message
        } else {
            throw $_
        }
    }
}