Private/ProviderFactory.ps1

# PSSnips — Provider factory helper

function script:Get-RemoteProvider {
    [CmdletBinding()]
    [OutputType([RemoteProvider])]
    param(
        [ValidateSet('GitHub', 'GitLab', 'Bitbucket')]
        [string]$Name
    )
    $cfg = script:LoadCfg
    switch ($Name) {
        'GitHub' {
            $tok  = script:GetGitHubToken
            $user = if ($cfg.ContainsKey('GitHubUsername')) { $cfg['GitHubUsername'] } else { '' }
            return [GitHubProvider]::new($tok, $user)
        }
        'GitLab' {
            $tok   = script:GetGitLabToken
            $glUrl = if ($cfg.ContainsKey('GitLabUrl') -and $cfg['GitLabUrl']) { $cfg['GitLabUrl'] } else { 'https://gitlab.com' }
            return [GitLabProvider]::new($tok, $glUrl)
        }
        'Bitbucket' {
            # Check credentials exist before calling GetBitbucketCreds to avoid
            # showing the "credentials not set" warning during IsConfigured() probes.
            $hasUser = $env:BITBUCKET_USERNAME -or ($cfg.ContainsKey('BitbucketUsername') -and $cfg['BitbucketUsername'])
            $hasPass = $env:BITBUCKET_APP_PASSWORD -or ($cfg.ContainsKey('BitbucketAppPassword') -and $cfg['BitbucketAppPassword'])
            $cred = if ($hasUser -and $hasPass) { script:GetBitbucketCreds } else { $null }
            $ws   = if ($cfg.ContainsKey('BitbucketUsername') -and $cfg['BitbucketUsername']) { $cfg['BitbucketUsername'] } else { '' }
            return [BitbucketProvider]::new($cred, $ws)
        }
    }
}