// Copyright Epic Games, Inc. All Rights Reserved. using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; using System.Xml; using EpicGames.Core; using UnrealBuildBase; 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 { get; set; } /// /// json key path to find in each file /// [TaskParameter(ValidationType = TaskParameterValidationType.Default)] public string KeyPath { get; set; } /// /// new value to apply /// [TaskParameter(ValidationType = TaskParameterValidationType.Default)] public int NewValue { get; set; } } /// /// Modifies json files by setting a value specified in the key path /// [TaskElement("ModifyJsonValue", typeof(ModifyJsonValueParameters))] public class ModifyJsonValue : BgTaskImpl { readonly ModifyJsonValueParameters _parameters; /// /// Create a new ModifyJsonValue. /// /// Parameters for this task. public ModifyJsonValue(ModifyJsonValueParameters parameters) { _parameters = parameters; } /// /// 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 (string jsonFile in files.Select(f => f.FullName)) { string oldContents = await File.ReadAllTextAsync(jsonFile); IDictionary paramObj = fastJSON.JSON.Instance.Parse(oldContents) as IDictionary; IDictionary 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; string 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; } } }