private/Find-ChocoPackage.ps1

function Find-ChocoPackage {
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Name,

        [string]
        $RequiredVersion,

        [string]
        $MinimumVersion,

        [string]
        $MaximumVersion
    )

    # Throw an error if provided version arguments don't make sense
    Confirm-VersionParameters -Name $Name -MinimumVersion $MinimumVersion -MaximumVersion $MaximumVersion -RequiredVersion $RequiredVersion

    $options = $request.Options
    foreach( $o in $options.Keys ) {
        Write-Debug ( "OPTION: {0} => {1}" -f ($o, $options[$o]) )
    }

    [array]$RegisteredPackageSources = Get-PackageSources

    if ($options -and $options.ContainsKey('Source')) {
        # Finding the matched package sources from the registered ones
        Write-Verbose ($LocalizedData.SpecifiedSource -f ($options['Source']))
        if ($RegisteredPackageSources.Name -eq $options['Source']) {
            # Found the matched registered source
            $selectedSource = $options['Source']
        } else {
            ThrowError -ExceptionName 'System.ArgumentException' `
                -ExceptionMessage ($LocalizedData.PackageSourceNotFound -f ($options['Source'])) `
                -ErrorId 'PackageSourceNotFound' `
                -ErrorCategory InvalidArgument `
                -ExceptionObject $options['Source']
        }
    } else {
        # User did not specify a source. Now what?
        if ($RegisteredPackageSources.Count -eq 1) {
            # If no source name is specified and only one source is available, use it
            $selectedSource = $RegisteredPackageSources[0].Name
        } elseif ($RegisteredPackageSources.Name -eq $script:PackageSource) {
            # If multiple sources are avaiable but none specified, default to using Chocolatey.org - if present
            $selectedSource = $script:PackageSource
        } else {
            # If Chocoately.org is not present and no source specified, throw an exception
            ThrowError -ExceptionName 'System.ArgumentException' `
                -ExceptionMessage $LocalizedData.UnspecifiedSource `
                -ErrorId 'UnspecifiedSource' `
                -ErrorCategory InvalidArgument
        }
    }

    Write-Verbose "Source selected: $selectedSource"

    $chocoParams = @{
        Name = $Name
        Source = $selectedSource
    }

    if ($requiredVersion -or $minimumVersion -or $maximumVersion -or $options.ContainsKey($script:AllVersions)) {
        if ($requiredVersion) {
            $chocoParams.Add('Version',$requiredVersion)
        } else {
            # Choco does not support searching by min or max version, so if a user is picky we'll need to pull back all versions and filter ourselves
            $chocoParams.Add('AllVersions',$true)
        }

        if (-not $env:CHOCO_NONEXACT_SEARCH) {
            # Limit NuGet API result set to just the specific package name if version is specified
            # Have to keep choco pinned to 0.10.13 due to https://github.com/chocolatey/choco/issues/1843 - should be fixed in 0.10.16, which is still in beta
            $chocoParams.Add('Exact',$true)
        }
    }

    # Return the result without additional evaluation, even if empty, to let PackageManagement handle error management
    # Will only terminate if Choco fails to call choco.exe
    $(if ($script:NativeAPI) {
        Invoke-ChocoAPI -Search @chocoParams
    } else {
        Get-ChocoPackage @chocoParams | ConvertTo-SoftwareIdentity -Name $Name -Source $selectedSource
    }) | Where-Object {Test-PackageName -Name $_.Name -RequestedName $Name} |
            Where-Object {Test-PackageVersion -Package $_ -RequiredVersion $RequiredVersion -MinimumVersion $MinimumVersion -MaximumVersion $MaximumVersion}
}