Releases.psm1

function Get-GithubRelease {
    [CmdletBinding(DefaultParameterSetName='ByRepo')]
    [OutputType('Github.Release')]
    param(
        [Parameter(ParameterSetName='ByRepo', ValueFromPipelineByPropertyName)]
        [Parameter(ParameterSetName='ById', ValueFromPipelineByPropertyName)]
        [Parameter(ParameterSetName='ByTag', ValueFromPipelineByPropertyName)]
        [Parameter(ParameterSetName='ByLatest', ValueFromPipelineByPropertyName)]
        [string]
        $RepositoryId = '.',

        [Parameter(Position=0, ParameterSetName='ById')]
        [Alias('Id')]
        [string]
        $ReleaseId,

        [Parameter(ParameterSetName='ByTag')]
        [string]
        $Tag,

        [Parameter(ParameterSetName='ByLatest')]
        [switch]
        $Latest,

        [Parameter(ParameterSetName='ByRepo')]
        [switch]
        $IncludePrerelease,

        [Parameter(ParameterSetName='ByRepo')]
        [uint]
        $MaxPages,

        [switch]
        [Parameter(ParameterSetName='ByRepo')]
        $All,

        [Parameter()]
        [string]
        $Select
    )

    $Repo = Resolve-GithubRepository $RepositoryId

    if ($ReleaseId) {
        # https://docs.github.com/en/rest/releases/releases#get-a-release
        $Result = Invoke-GithubApi GET "repos/$Repo/releases/$ReleaseId" |
            New-GithubObject 'Github.Release' |
            Add-Member -NotePropertyMembers @{ RepositoryId = $Repo } -PassThru
    } elseif ($Tag) {
        # https://docs.github.com/en/rest/releases/releases#get-a-release-by-tag-name
        $Result = Invoke-GithubApi GET "repos/$Repo/releases/tags/$Tag" |
            New-GithubObject 'Github.Release' |
            Add-Member -NotePropertyMembers @{ RepositoryId = $Repo } -PassThru
    } elseif ($Latest) {
        # https://docs.github.com/en/rest/releases/releases#get-the-latest-release
        $Result = Invoke-GithubApi GET "repos/$Repo/releases/latest" |
            New-GithubObject 'Github.Release' |
            Add-Member -NotePropertyMembers @{ RepositoryId = $Repo } -PassThru
    } else {
        # https://docs.github.com/en/rest/releases/releases#list-releases
        $MaxPages = Resolve-GithubMaxPages -MaxPages:$MaxPages -All:$All
        $Result = Invoke-GithubApi GET "repos/$Repo/releases" -MaxPages $MaxPages |
            New-GithubObject 'Github.Release' |
            Add-Member -NotePropertyMembers @{ RepositoryId = $Repo } -PassThru

        # Github API includes prereleases by default
        if (-not $IncludePrerelease) {
            $Result = $Result | Where-Object { -not $_.Prerelease }
        }
    }

    $Result | Get-FilteredObject $Select
}