// Copyright Epic Games, Inc. All Rights Reserved. using AutomationTool; using EpicGames.BuildGraph; using System.Collections.Generic; using System.Linq; using System.Xml; using System.IO; using System.Text; using EpicGames.Core; using UnrealBuildBase; using System.Text.Json; using System.Threading.Tasks; namespace AutomationTool.Tasks { /// /// Parameters for a ModifyJsonValue task /// public class ModifyJsonValueParameters { /// /// json file paths which will be modified /// [TaskParameter(ValidationType = TaskParameterValidationType.FileSpec)] public string Files; /// /// json key path to find in each file /// [TaskParameter(ValidationType = TaskParameterValidationType.Default)] public string KeyPath; /// /// new value to apply /// [TaskParameter(ValidationType = TaskParameterValidationType.Default)] public int NewValue; } /// /// Modifies json files by setting a value specified in the key path /// [TaskElement("ModifyJsonValue", typeof(ModifyJsonValueParameters))] public class ModifyJsonValue : BgTaskImpl { ModifyJsonValueParameters Parameters; /// /// Create a new ModifyJsonValue. /// /// Parameters for this task. public ModifyJsonValue(ModifyJsonValueParameters InParameters) { Parameters = InParameters; } /// /// Placeholder comment /// public override async Task ExecuteAsync(JobContext Job, HashSet BuildProducts, Dictionary> TagNameToFileSet) { string[] Keys = Parameters.KeyPath.Split('.'); if (Keys.Length == 0) { return; } HashSet Files = ResolveFilespec(Unreal.RootDirectory, Parameters.Files, TagNameToFileSet); foreach (var JsonFile in Files.Select(f => f.FullName)) { var OldContents = File.ReadAllText(JsonFile); var ParamObj = fastJSON.JSON.Instance.Parse(OldContents) as IDictionary; var CurrObj = ParamObj; for (int i = 0; i < Keys.Length - 1; i++) { if (!CurrObj.TryGetValue(Keys[i], out object NextNode)) CurrObj[Keys[i]] = NextNode = new Dictionary(); CurrObj = (IDictionary)NextNode; } CurrObj[Keys[Keys.Length - 1]] = Parameters.NewValue; var NewContents = JsonSerializer.Serialize(ParamObj, new JsonSerializerOptions { WriteIndented = true }); await File.WriteAllTextAsync(JsonFile, NewContents, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)); } } /// /// Placeholder comment /// public override void Write(XmlWriter Writer) { Write(Writer, Parameters); } /// /// Placeholder comment /// public override IEnumerable FindConsumedTagNames() { foreach (string TagName in FindTagNamesFromFilespec(Parameters.Files)) { yield return TagName; } } /// /// Placeholder comment /// public override IEnumerable FindProducedTagNames() { yield break; } } }