public/Install-TerraformVersion.ps1

function Install-TerraformVersion
{
    [CmdletBinding(DefaultParameterSetName="Version")]
    param(
        [Parameter(Mandatory, Position=0, ParameterSetName="Version")]
        [Version] $Version,

        [Parameter()]
        [switch] $Force,

        [Parameter(ParameterSetName="Latest")]
        [switch] $Latest
    )

    if ($Latest)
    {
        $Version = Get-TerraformVersion -All |
            Select-Object -ExpandProperty Version |
            Sort-Object -Descending |
            Select-Object -First 1
    }

    $VersionPath = Join-Path -Path $script:Terramorph.Path.Versions -ChildPath $Version

    if((Test-Path -Path $VersionPath))
    {
        if(-not $Force)
        {
            Write-Warning "Version '$Version' is already installed, use -Force to reinstall"

            return [PSCustomObject] @{
                Version     = $Version
                Installed   = $false
                Reason      = "Already installed"
            }
        }

        Get-Item -Path $VersionPath | Remove-Item -Force -Recurse
    }

    $TempFilePath   = [IO.Path]::GetTempFileName()
    $ReleaseInfo    = Get-TerraformReleaseInfo -Version $Version
    $ReleaseUri     = "$($ReleaseInfo.BaseUrl)/$($ReleaseInfo.FileName)"

    Write-Verbose "Downloading terraform $Version from $ReleaseUri"

    try
    {
        $WebClient = [Net.WebClient]::new()
        $WebClient.DownloadFile($ReleaseUri, $TempFilePath)
    }
    catch [System.Net.WebException]
    {
        if($_.Exception.Response.StatusCode -eq "NotFound")
        {
            Write-Error "Version $Version is not available on releases.hashicorp.com"
        }

        throw $_
    }

    if(-not(Test-TerraformReleaseChecksum -Version $Version -FilePath $TempFilePath))
    {
        Remove-Item -Path $TempFilePath

        throw "Checksum verification failed for version $Version."
    }


    Write-Verbose "Installing terraform $Version into $VersionPath"

    New-Item -Path $VersionPath -ItemType Directory | Out-Null
    Expand-Archive -Path $TempFilePath -DestinationPath $VersionPath -Force

    [PSCustomObject] @{
        Version     = $Version
        Installed   = $true
    }
}