132 lines
5.2 KiB
C#

#if UNITY_EDITOR
using System;
using System.Text.RegularExpressions;
namespace lilToon
{
public class SemVerParser {
public int major;
public int minor;
public int patch;
public string prerelease;
public string build;
public SemVerParser(string versionString, bool isForced) {
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
var pattern = @"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$";
var pattern2 = @"(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)";
var regex = new Regex(pattern);
var regex2 = new Regex(pattern2);
var match = regex.Match(versionString);
var match2 = regex2.Match(versionString);
if (match.Success) {
major = int.Parse(match.Groups[1].Value);
minor = int.Parse(match.Groups[2].Value);
patch = int.Parse(match.Groups[3].Value);
prerelease = match.Groups[4].Success ? match.Groups[4].Value : null;
build = match.Groups[5].Success ? match.Groups[5].Value : null;
} else if (match2.Success) {
major = int.Parse(match2.Groups[1].Value);
minor = int.Parse(match2.Groups[2].Value);
patch = int.Parse(match2.Groups[3].Value);
prerelease = null;
build = null;
} else if(isForced) {
major = 999999;
minor = 999999;
patch = 999999;
} else {
throw new ArgumentException("Invalid semver string: " + versionString);
}
}
public SemVerParser(string versionString) {
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
var pattern = @"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$";
var regex = new Regex(pattern);
var match = regex.Match(versionString);
if (match.Success) {
major = int.Parse(match.Groups[1].Value);
minor = int.Parse(match.Groups[2].Value);
patch = int.Parse(match.Groups[3].Value);
prerelease = match.Groups[4].Success ? match.Groups[4].Value : null;
build = match.Groups[5].Success ? match.Groups[5].Value : null;
} else {
throw new ArgumentException("Invalid semver string: " + versionString);
}
}
public int CompareTo(SemVerParser other) {
if (other == null) {
return 1;
}
if (major != other.major) {
return major.CompareTo(other.major);
}
if (minor != other.minor) {
return minor.CompareTo(other.minor);
}
if (patch != other.patch) {
return patch.CompareTo(other.patch);
}
if (prerelease == null && other.prerelease != null) {
return 1;
} else if (prerelease != null && other.prerelease == null) {
return -1;
} else if (prerelease != null && other.prerelease != null) {
int cmp = string.Compare(prerelease, other.prerelease);
if (cmp != 0) {
return cmp;
}
}
if (build == null && other.build != null) {
return 1;
} else if (build != null && other.build == null) {
return -1;
} else if (build != null && other.build != null) {
int cmp = string.Compare(build, other.build);
if (cmp != 0) {
return cmp;
}
}
return 0;
}
public static bool operator ==(SemVerParser v1, SemVerParser v2) {
if (ReferenceEquals(v1, v2)) {
return true;
}
if (ReferenceEquals(v1, null) || ReferenceEquals(v2, null)) {
return false;
}
return v1.CompareTo(v2) == 0;
}
public static bool operator !=(SemVerParser v1, SemVerParser v2) { return !(v1 == v2); }
public static bool operator < (SemVerParser v1, SemVerParser v2) { return v1.CompareTo(v2) < 0; }
public static bool operator <=(SemVerParser v1, SemVerParser v2) { return v1.CompareTo(v2) <= 0; }
public static bool operator > (SemVerParser v1, SemVerParser v2) { return v1.CompareTo(v2) > 0; }
public static bool operator >=(SemVerParser v1, SemVerParser v2) { return v1.CompareTo(v2) >= 0; }
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return base.ToString();
}
}
}
#endif