// Copyright Epic Games, Inc. All Rights Reserved. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using EpicGames.Core; namespace UnrealBuildTool { /// /// Stores custom build steps to be executed by a project or plugin /// public class CustomBuildSteps { Dictionary HostPlatformToCommands = new Dictionary(); /// /// Construct a custom build steps object from a Json object. /// public CustomBuildSteps(JsonObject RawObject) { foreach (string HostPlatformName in RawObject.KeyNames) { UnrealTargetPlatform Platform; if (UnrealTargetPlatform.TryParse(HostPlatformName, out Platform)) { HostPlatformToCommands.Add(Platform, RawObject.GetStringArrayField(HostPlatformName)); } } } /// /// Reads a list of build steps from a Json project or plugin descriptor /// /// The json descriptor object /// Name of the field to read /// Output variable to store the sorted dictionary that was read /// True if the field was read (and OutBuildSteps is set), false otherwise. public static bool TryRead(JsonObject RawObject, string FieldName, [NotNullWhen(true)] out CustomBuildSteps? OutBuildSteps) { JsonObject? BuildStepsObject; if (RawObject.TryGetObjectField(FieldName, out BuildStepsObject)) { OutBuildSteps = new CustomBuildSteps(BuildStepsObject); return true; } else { OutBuildSteps = null; return false; } } /// /// Reads a list of build steps from a Json project or plugin descriptor /// /// Writer to receive json output /// Name of the field to read /// True if the field was read (and OutBuildSteps is set), false otherwise. public void Write(JsonWriter Writer, string FieldName) { Writer.WriteObjectStart(FieldName); foreach (KeyValuePair Pair in HostPlatformToCommands.OrderBy(x => x.Key.ToString())) { Writer.WriteArrayStart(Pair.Key.ToString()); foreach (string Line in Pair.Value) { Writer.WriteValue(Line); } Writer.WriteArrayEnd(); } Writer.WriteObjectEnd(); } /// /// Converts this object to a JsonObject to be saved or manipulated. /// /// The JsonObject representation of this object. public JsonObject ToJsonObject() { JsonObject CustomBuildStepObject = new JsonObject(); foreach (KeyValuePair Pair in HostPlatformToCommands.OrderBy(x => x.Key.ToString())) { CustomBuildStepObject.AddOrSetFieldValue(Pair.Key.ToString(), Pair.Value); } return CustomBuildStepObject; } /// /// Tries to get the commands for a given host platform /// /// The host platform to look for /// Array of commands /// True if a list of commands was generated public bool TryGetCommands(UnrealTargetPlatform HostPlatform, [NotNullWhen(true)] out string[]? OutCommands) { string[]? Commands; if (HostPlatformToCommands.TryGetValue(HostPlatform, out Commands) && Commands.Length > 0) { OutCommands = Commands; return true; } else { OutCommands = null; return false; } } } }