public static SemanticVersion IncrementPatchVersion(this SemanticVersion version)
 {
     if (version.IsPrerelease)
     {
         var prereleaseIdentifier = PrereleaseIdentifier.Parse(version);
         return(version.IncrementPrerelease(prereleaseIdentifier.Label));
     }
     else
     {
         return(new SemanticVersion(version.Major, version.Minor, version.Patch + 1));
     }
 }
    public SemanticVersion NextVersion(SemanticVersion version, string prereleaseLabel = null)
    {
        var versionImpact = CalculateVersionImpact();
        var isPrerelease  = !string.IsNullOrEmpty(prereleaseLabel);

        var nextVersion = versionImpact switch
        {
            VersionImpact.Patch => new SemanticVersion(version.Major, version.Minor, version.Patch + 1),
            VersionImpact.Minor => new SemanticVersion(version.Major, version.Minor + 1, 0),
            VersionImpact.Major => new SemanticVersion(version.Major + 1, 0, 0),
            VersionImpact.None => version,
            _ => throw new InvalidOperationException($"Version impact of {versionImpact} cannot be handled"),
        };

        if (version.IsPrerelease && isPrerelease)
        {
            if (versionImpact == VersionImpact.None)
            {
                return(version);
            }

            return(IsWithinPrereleaseVersionRange(version, versionImpact)?version.IncrementPrerelease(prereleaseLabel):nextVersion.AsPrerelease(prereleaseLabel, 0));
        }
        else if (!version.IsPrerelease && isPrerelease)
        {
            return(nextVersion.AsPrerelease(prereleaseLabel, 0));
        }
        else if (version.IsPrerelease && !isPrerelease)
        {
            return((IsWithinPrereleaseVersionRange(version, versionImpact)?version:nextVersion).AsRelease());
        }
        else
        {
            return(nextVersion);
        }
    }