13 internal static class VersionParser
22 public static bool CheckPreviewStatus(
string input)
24 if (
string.IsNullOrWhiteSpace(input) || input.Length < 7)
30 if (input.EndsWith(
"PREVIEW", StringComparison.OrdinalIgnoreCase))
45 public static Version Parse(
string input)
47 if (
string.IsNullOrWhiteSpace(input))
49 return new Version(0, 0);
52 if (Version.TryParse(input, out Version? result))
57 return CleanParse(input);
70 private static Version CleanParse(
string input)
72 string[] versionParts = input.Split(
'.');
79 if (versionParts.Length >= 1)
81 major = ParseToInt(versionParts[0]);
84 if (versionParts.Length >= 2)
86 minor = ParseToInt(versionParts[1]);
89 if (versionParts.Length >= 3)
91 build = ParseToInt(versionParts[2], -1);
94 if (versionParts.Length >= 4)
96 revision = ParseToInt(versionParts[3], -1);
101 return new Version(major, minor);
103 else if (revision < 0)
105 return new Version(major, minor, build);
109 return new Version(major, minor, build, revision);
121 private static int ParseToInt(
string input,
int defaultValue = 0)
123 if (
int.TryParse(input, out
int result))
128 return CleanParseToInt(input, defaultValue);
143 private static int CleanParseToInt(
string input,
int defaultValue = 0)
145 string cleanInput = CleanupNumberString(input);
147 if (
int.TryParse(cleanInput, out
int result))
165 private static string CleanupNumberString(
string input)
169 input = RemoveAppendix(input);
171 char[] parts = input.ToCharArray();
173 StringBuilder cleanString =
new();
174 bool lastCharWasALetter =
false;
175 for (
int i = 0; i < parts.Length; i++)
177 if (
char.IsDigit(parts[i]) && !lastCharWasALetter)
179 cleanString.Append(parts[i]);
181 else if (
char.IsDigit(parts[i]) && lastCharWasALetter)
189 lastCharWasALetter =
true;
193 return cleanString.ToString();
206 private static string RemoveAppendix(
string input)
208 string[] parts = input.Split(
'-');
210 if (parts.Length >= 1)