ln.build/ln.build/semver/Version.cs

84 lines
2.6 KiB
C#

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using ln.build.semver;
using Microsoft.VisualBasic;
namespace ln.build.semver
{
public class SemVersion
{
public int Major { get; set; }
public int Minor { get; set; }
public int Patch { get; set; }
public string PreRelease { get; set; } = String.Empty;
public bool IsPreRelease => !PreRelease?.Equals(string.Empty) ?? false;
public bool IsRelease => PreRelease?.Equals(string.Empty) ?? true;
public SemVersion(int major,int minor,int patch,string prerelease)
{
Major = major;
Minor = minor;
Patch = patch;
PreRelease = prerelease;
}
private SemVersion(){}
public SemVersion(SemVersion source)
:this(source.Major, source.Minor, source.Patch, source.PreRelease)
{ }
public void Increment(SemVerLevels level){
switch (level)
{
case SemVerLevels.MAJOR:
Major++;
Minor = 0;
Patch = 0;
break;
case SemVerLevels.MINOR:
Minor++;
Patch = 0;
break;
case SemVerLevels.PATCH:
Patch++;
break;
}
}
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendFormat("{0}.{1}.{2}", Major, Minor, Patch);
if (!PreRelease?.Equals(string.Empty) ?? false)
stringBuilder.AppendFormat("-{0}", PreRelease);
return stringBuilder.ToString();
}
public static Regex rexVersion = new Regex("^(?<major>\\d+).(?<minor>\\d+).(?<patch>\\d+)(-(?<prerelease>.+))?$");
public static SemVersion Parse(string versionString)
{
Match match = rexVersion.Match(versionString);
if (!match.Success)
throw new FormatException(String.Format("{0} is no valid SemVer", versionString));
SemVersion version = new SemVersion();
version.Major = int.Parse(match.Groups["major"].Value);
version.Minor = int.Parse(match.Groups["minor"].Value);
version.Patch = int.Parse(match.Groups["patch"].Value);
if (match.Groups["prerelease"].Success)
version.PreRelease = match.Groups["prerelease"].Value;
return version;
}
}
}