/// <summary> /// Tries to read mod name and mod version from a file name. /// The file name can not contain an extension. /// </summary> /// <param name="fileName">The file name to parse.</param> /// <param name="name">Out. The parsed mod name.</param> /// <param name="version">Out. The parsed mod version.</param> /// <param name="enabled">Out. Indicates if the mod file is enabled.</param> /// <param name="hasUid">Specifies if the file name contains a UID.</param> /// <returns>Returns true if the file name was a valid mod file name, otherwise false.</returns> private static bool TryParseModName(string fileName, out string name, out GameCompatibleVersion version, out bool enabled, bool hasUid) { name = null; version = null; enabled = !fileName.EndsWith(DisabledNameSuffix); if (!enabled) { fileName = fileName.Substring(0, fileName.Length - DisabledNameSuffix.Length); } int index = fileName.LastIndexOf('_'); if ((index < 1) || (index >= fileName.Length - 1)) { return(false); } name = fileName.Substring(0, index); if (hasUid) { name = GetNameWithoutUid(name); } string versionString = fileName.Substring(index + 1); return(GameCompatibleVersion.TryParse(versionString, out version)); }
public ModDependency(string value) { if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentNullException(nameof(value)); } value = value.Trim(); if (value[0] == '?') // Optional { IsOptional = true; value = value.Substring(1).TrimStart(); } else if (value[0] == '!') // Inverted { IsInverted = true; value = value.Substring(1).TrimStart(); } else if (value.StartsWith("(?)")) // Optional hidden { IsOptional = true; IsHidden = true; value = value.Substring(3).TrimStart(); } if (string.IsNullOrEmpty(value)) { throw new ArgumentException("No mod name specified.", nameof(value)); } HasRestriction = false; string[] parts = { }; foreach (var comparison in comparisonFunctions.Keys) { parts = value.Split(new[] { comparison }, StringSplitOptions.None); if (parts.Length == 1) { // Comparison not present continue; } else if (parts.Length == 2) { // Comparison present HasRestriction = true; RestrictionComparison = comparison; break; } else { // Comparison present more than once throw new ArgumentException("Invalid input format.", nameof(value)); } } if (HasRestriction) { ModName = parts[0].TrimEnd(); string versionString = parts[1].TrimStart(); if (!GameCompatibleVersion.TryParse(versionString, out var version)) { throw new ArgumentException("Invalid input format.", nameof(value)); } RestrictionVersion = version; } else { ModName = value; } // Friendly description var sb = new StringBuilder(); string name = ModName; if (name == "base") { name = "Factorio"; } sb.Append(name); if (HasRestriction) { sb.Append(' '); sb.Append(comparisonRepresentations[RestrictionComparison]); sb.Append(' '); sb.Append(RestrictionVersion); } FriendlyDescription = sb.ToString(); // ToString sb.Clear(); if (IsOptional) { sb.Append("? "); } if (IsInverted) { sb.Append('!'); } sb.Append(ModName); if (HasRestriction) { sb.Append(' '); sb.Append(RestrictionComparison); sb.Append(' '); sb.Append(RestrictionVersion); } stringRepresentation = sb.ToString(); }