Files
OpenRA/OpenRA.Mods.Common/UtilityCommands/Utilities.cs
RoosterDragon e6914f707a Introduce FirstOrDefault extensions method for Array.Find and List.Find.
This allows the LINQ spelling to be used, but benefits from the performance improvement of the specific methods for these classes that provide the same result.
2023-11-19 19:28:57 +02:00

53 lines
1.6 KiB
C#

#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System;
using System.IO;
using OpenRA.FileSystem;
namespace OpenRA.Mods.Common.UtilityCommands
{
public static class Utilities
{
public static MiniYamlNode GetTopLevelNodeByKey(ModData modData, string key,
Func<Manifest, string[]> manifestPropertySelector,
Func<Map, MiniYaml> mapPropertySelector = null,
string mapPath = null)
{
if (manifestPropertySelector == null)
throw new ArgumentNullException(nameof(manifestPropertySelector), "Must pass a non-null manifestPropertySelector");
Map map = null;
if (mapPath != null)
{
try
{
map = new Map(modData, new Folder(Platform.EngineDir).OpenPackage(mapPath, modData.ModFiles));
}
catch (InvalidDataException ex)
{
Console.WriteLine("Could not load map '{0}' so this data does not include the map's overrides.", mapPath);
Console.WriteLine(ex);
map = null;
}
}
var manifestNodes = manifestPropertySelector.Invoke(modData.Manifest);
var mapProperty = map == null || mapPropertySelector == null ? null
: mapPropertySelector.Invoke(map);
var fs = map ?? modData.DefaultFileSystem;
var topLevelNodes = MiniYaml.Load(fs, manifestNodes, mapProperty);
return topLevelNodes.FirstOrDefault(n => n.Key == key);
}
}
}