public static bool TryParse(string version, out UnityVersion?result, bool strict = false) { int cursor = 0; int major = 0; int minor = 0; int revision = 0; // missing release type identifier means 'f' - public release, so that is the default as well UnityVersion.UnityReleaseType releaseType = UnityVersion.UnityReleaseType.kPublicRelease; int incrementalVersion = 0; string suffix = ""; bool isValid = true; // Doing this instead because RegEx is impressively slow try { isValid = cursor < version.Length && TryReadVersionNumber(version, ref cursor, ref major); isValid = isValid && (cursor == version.Length || TrySkipVersionSeparator(version, ref cursor)); isValid = isValid && (cursor == version.Length || TryReadVersionNumber(version, ref cursor, ref minor)); isValid = isValid && (cursor == version.Length || TrySkipVersionSeparator(version, ref cursor)); isValid = isValid && (cursor == version.Length || TryReadVersionNumber(version, ref cursor, ref revision)); isValid = isValid && (cursor == version.Length || TryReadVersionReleaseType(version, ref cursor, ref releaseType)); isValid = isValid && (cursor == version.Length || // experimental 'x' releases can have any characters following the 'x', so we don't read incrementalVersion but save the rest into the suffix releaseType == UnityVersion.UnityReleaseType.kExperimentalRelease || TryReadVersionNumber(version, ref cursor, ref incrementalVersion)); // if there's anything left, read the rest as suffix if experimental release or allowSuffix parse request if (isValid && cursor < version.Length) { if (releaseType == UnityVersion.UnityReleaseType.kExperimentalRelease || !strict) { suffix = version.Substring(cursor); } else { isValid = false; } } } catch (Exception) { result = null; return(false); } if (!isValid) { result = null; return(false); } result = new UnityVersion(major, minor, revision, releaseType, incrementalVersion, suffix); return(true); }
public static bool TryParseUnityReleaseType(char releaseType, out UnityVersion.UnityReleaseType result) { for (int i = (int)UnityVersion.UnityReleaseType.kAlphaRelease; i < (int)UnityVersion.UnityReleaseType.kNumUnityReleaseTypes; ++i) { if (releaseType == k_ValidReleaseTypeSymbols[i]) { result = (UnityVersion.UnityReleaseType)i; return(true); } } result = UnityVersion.UnityReleaseType.kNumUnityReleaseTypes; return(false); }
private static bool TryReadVersionReleaseType(string version, ref int cursor, ref UnityVersion.UnityReleaseType releaseType) { if (cursor < version.Length && UnityVersionTypeTraits.IsAllowedUnityReleaseTypeIdentifier(version[cursor])) { if (UnityVersionTypeTraits.TryParseUnityReleaseType(version[cursor], out releaseType)) { cursor++; return(true); } } return(false); }