src/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.SpecifiedSourceName -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:PackageSourceName) {
            # If multiple sources are avaiable but none specified, default to using Chocolatey.org - if present
            $selectedSource = $script:PackageSourceName
        } 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 = @{
        Search = $true
        Package = $name
        SourceName = $selectedSource
    }

    if ($requiredVersion) {
        $chocoParams.Add('Version',$requiredVersion)
    } elseif ($minimumVersion -or $maximumVersion -or $options.ContainsKey($script:AllVersions)) {
        # 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)
    }

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