Src/VersionManager.psm1

enum VersionComponent
{
    Major
    Minor
    Build
}


class VersionManager
{
    [HashTable]$devTools = $global:devTools
    [String]$psd
    [String]$regex = "ModuleVersion\s=\s'(?<version>.+)'"
    [String]$content
    [Version]$version
    
    VersionManager($data)
    {
        $this.psd = $data.psd
        $this.content = Get-Content $this.psd | Out-String
        $this.version = $this.getVersion()
    }
    
    [Version]getVersion()
    {
        $result = switch ($this.content -match $this.regex)
        {
            True { $matches['version'] }
            default { $false }
        }
        
        return $result
    }
    
    [String]next([VersionComponent]$incr)
    {
        $temlate = @{
            [VersionComponent]::Major = $this.version.Major
            [VersionComponent]::Minor = $this.version.Minor
            [VersionComponent]::Build = $this.version.Build
        }
        
        $temlate.Item($incr) += $true
        
        return '{2}.{1}.{0}' -f ([Array]$temlate.Values)
    }
    
    [Void]apply($nextVersion)
    {
        $result = $this.content -replace $this.regex, "ModuleVersion = '$nextVersion'"
        $result.trim() |
        Set-Content $this.psd
    }

    [Void]updateBadge($nextVersion, $readme, $projectName)
    {
        $rm = Get-Content $readme | Out-String

        $badge = 'PowerShell_Gallery-{0}-green.svg'
        $link = "/packages/$projectName/{0}"
        
        $rm = $rm -replace ($badge -f '(.+)'), ($badge -f $nextVersion)
        $rm = $rm -replace ($link -f '(.+)'), ($link -f $nextVersion)
        
        $rm.trim() | Set-Content $readme
    }
}