// 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;
}
}
}
}