Private/Repository/ConvertTo-CgrRepository.ps1

function ConvertTo-CgrRepository {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [psobject] $Repository,

        [Parameter(Mandatory)]
        [string] $HostName
    )

    process {
        $ownerName = $null
        $owner = Get-CgrObjectProperty -InputObject $Repository -Name 'owner'
        $ownerLogin = Get-CgrObjectProperty -InputObject $owner -Name 'login'
        if ($null -ne $ownerLogin) {
            $ownerName = [string] $ownerLogin
        }

        $visibility = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'visibility')
        if ([string]::IsNullOrWhiteSpace($visibility)) {
            if (Get-CgrObjectProperty -InputObject $Repository -Name 'private') {
                $visibility = 'private'
            }
            else {
                $visibility = 'public'
            }
        }

        $repositoryPermissions = Get-CgrObjectProperty -InputObject $Repository -Name 'permissions'
        $adminPermission = Get-CgrObjectProperty -InputObject $repositoryPermissions -Name 'admin'
        $maintainPermission = Get-CgrObjectProperty -InputObject $repositoryPermissions -Name 'maintain'
        $pushPermission = Get-CgrObjectProperty -InputObject $repositoryPermissions -Name 'push'
        $triagePermission = Get-CgrObjectProperty -InputObject $repositoryPermissions -Name 'triage'
        $pullPermission = Get-CgrObjectProperty -InputObject $repositoryPermissions -Name 'pull'
        $permissions = [ordered] @{
            Admin = [bool] ($adminPermission -eq $true)
            Maintain = [bool] ($maintainPermission -eq $true)
            Push = [bool] ($pushPermission -eq $true)
            Triage = [bool] ($triagePermission -eq $true)
            Pull = [bool] ($pullPermission -eq $true)
        }

        $updatedAt = Get-CgrObjectProperty -InputObject $Repository -Name 'updated_at'
        $topics = Get-CgrObjectProperty -InputObject $Repository -Name 'topics'
        $repositoryId = Get-CgrObjectProperty -InputObject $Repository -Name 'id'
        $repositoryNodeId = Get-CgrObjectProperty -InputObject $Repository -Name 'node_id'

        $nullableBooleanNames = @(
            'has_issues'
            'has_projects'
            'has_wiki'
            'has_discussions'
            'allow_squash_merge'
            'allow_merge_commit'
            'allow_rebase_merge'
            'allow_auto_merge'
            'delete_branch_on_merge'
            'allow_update_branch'
            'web_commit_signoff_required'
        )
        $nullableBooleans = @{}
        foreach ($propertyName in $nullableBooleanNames) {
            $propertyValue = Get-CgrObjectProperty -InputObject $Repository -Name $propertyName
            $nullableBooleans[$propertyName] = if ($null -eq $propertyValue) { $null } else { [bool] $propertyValue }
        }

        [pscustomobject] @{
            PSTypeName = 'CopyGitHubRepo.Repository'
            Id = if ($null -eq $repositoryId) { $null } else { [long] $repositoryId }
            NodeId = if ($null -eq $repositoryNodeId) { $null } else { [string] $repositoryNodeId }
            Name = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'name')
            FullName = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'full_name')
            Owner = $ownerName
            Visibility = $visibility
            IsPrivate = [bool] (Get-CgrObjectProperty -InputObject $Repository -Name 'private')
            IsArchived = [bool] (Get-CgrObjectProperty -InputObject $Repository -Name 'archived')
            IsFork = [bool] (Get-CgrObjectProperty -InputObject $Repository -Name 'fork')
            DefaultBranch = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'default_branch')
            Description = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'description')
            Homepage = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'homepage')
            HasIssues = $nullableBooleans['has_issues']
            HasProjects = $nullableBooleans['has_projects']
            HasWiki = $nullableBooleans['has_wiki']
            HasDiscussions = $nullableBooleans['has_discussions']
            AllowSquashMerge = $nullableBooleans['allow_squash_merge']
            AllowMergeCommit = $nullableBooleans['allow_merge_commit']
            AllowRebaseMerge = $nullableBooleans['allow_rebase_merge']
            AllowAutoMerge = $nullableBooleans['allow_auto_merge']
            DeleteBranchOnMerge = $nullableBooleans['delete_branch_on_merge']
            AllowUpdateBranch = $nullableBooleans['allow_update_branch']
            WebCommitSignoffRequired = $nullableBooleans['web_commit_signoff_required']
            Topics = if ($null -eq $topics) { $null } else { @($topics | ForEach-Object { [string] $_ } | Sort-Object) }
            HtmlUrl = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'html_url')
            CloneUrl = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'clone_url')
            SshUrl = [string] (Get-CgrObjectProperty -InputObject $Repository -Name 'ssh_url')
            HostName = $HostName
            Permissions = [pscustomobject] $permissions
            CanAdmin = [bool] ($permissions['Admin'] -eq $true)
            CanPush = [bool] ($permissions['Push'] -eq $true)
            UpdatedAt = if ($updatedAt) { [datetimeoffset] $updatedAt } else { $null }
        }
    }
}