lib/Find-GHGistByCondition.ps1

function Find-GHGistByCondition {
<#
.SYNOPSIS
Find a gist by searching for matching strings in its filename / description.
Alternatively, look up single gist with its known Id
.OUTPUTS
Gist object
#>

    [CmdletBinding()]
    param (
        # Search Param
        [Parameter(Mandatory=$true,Position=0,ParameterSetName='BySearchString')]
        [string]
        $SearchString
    )
    $ErrorActionPreference = 'Stop'
    $WarningPreference = 'Continue'
    $InformationPreference = 'Continue'

    $uri = "${script:ghserver}/gists"
    $headers = @{
        Authorization = "Bearer ${script:ghtoken}"
        Accept = 'application/vnd.github.v3+json'
    }

    $params = @{
        Uri = $uri
        Headers = $headers
        Method = 'GET'
    }

    Write-Verbose "Preparing Request..."
    Write-Verbose "$($params.Method): $($params.Uri)"
    Write-Verbose "Accept: $($params.Headers.Accept)"

    try {
        $gists = Invoke-RestMethod @params

    }
    catch {
        Write-Error "${PSItem.Exception.Message}"
    }

    try {
        Write-Verbose "Attempting to locate gist by search string: ${SearchString}"
        $query = $gists | Where-Object {
            $_.Description -match $SearchString -or
            ($_.Files | Get-Member -Type NoteProperty | Select-Object -ExpandProperty Name) -match $SearchString
        }

        if ($null -ne $query) {
            $resultSet = [System.Collections.ArrayList]@()
            foreach ($e in $query) {
                try
                {
                    $gistObj = Initialize-GHGistObject -resultData $e
                    $resultSet.Add($gistObj) | Out-Null
                }
                catch
                {
                    Write-Error "${PSItem.Exception.Message}"
                }
            }

            return $resultSet
        }
        else {
            Write-Information "No Matches found for: ${SearchString}"
        }

        return $query
    }
    catch {
        Write-Error "$PSItem"
    }
}