15db71995Sopenharmony_ci/* 25db71995Sopenharmony_ci * Copyright (c) 2023 The Khronos Group Inc. 35db71995Sopenharmony_ci * Copyright (c) 2023 Valve Corporation 45db71995Sopenharmony_ci * Copyright (c) 2023 LunarG, Inc. 55db71995Sopenharmony_ci * 65db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 75db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to 85db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the 95db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 105db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are 115db71995Sopenharmony_ci * furnished to do so, subject to the following conditions: 125db71995Sopenharmony_ci * 135db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in 145db71995Sopenharmony_ci * all copies or substantial portions of the Materials. 155db71995Sopenharmony_ci * 165db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 175db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 185db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 195db71995Sopenharmony_ci * 205db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 215db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 225db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 235db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS. 245db71995Sopenharmony_ci * 255db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com> 265db71995Sopenharmony_ci */ 275db71995Sopenharmony_ci 285db71995Sopenharmony_ci#pragma once 295db71995Sopenharmony_ci 305db71995Sopenharmony_ci#include <stack> 315db71995Sopenharmony_ci#include <string> 325db71995Sopenharmony_ci#include <utility> 335db71995Sopenharmony_ci 345db71995Sopenharmony_ci// Utility class to simplify the writing of JSON manifest files 355db71995Sopenharmony_ci 365db71995Sopenharmony_cistruct JsonWriter { 375db71995Sopenharmony_ci std::string output; 385db71995Sopenharmony_ci 395db71995Sopenharmony_ci // the bool represents whether an object has been written & a comma is needed 405db71995Sopenharmony_ci std::stack<bool> stack; 415db71995Sopenharmony_ci 425db71995Sopenharmony_ci void StartObject() { 435db71995Sopenharmony_ci CommaAndNewLine(); 445db71995Sopenharmony_ci Indent(); 455db71995Sopenharmony_ci output += "{"; 465db71995Sopenharmony_ci stack.push(false); 475db71995Sopenharmony_ci } 485db71995Sopenharmony_ci void StartKeyedObject(std::string const& key) { 495db71995Sopenharmony_ci CommaAndNewLine(); 505db71995Sopenharmony_ci Indent(); 515db71995Sopenharmony_ci output += "\"" + key + "\": {"; 525db71995Sopenharmony_ci stack.push(false); 535db71995Sopenharmony_ci } 545db71995Sopenharmony_ci void EndObject() { 555db71995Sopenharmony_ci stack.pop(); 565db71995Sopenharmony_ci output += "\n"; 575db71995Sopenharmony_ci Indent(); 585db71995Sopenharmony_ci output += "}"; 595db71995Sopenharmony_ci } 605db71995Sopenharmony_ci void StartKeyedArray(std::string const& key) { 615db71995Sopenharmony_ci CommaAndNewLine(); 625db71995Sopenharmony_ci Indent(); 635db71995Sopenharmony_ci output += "\"" + key + "\": ["; 645db71995Sopenharmony_ci stack.push(false); 655db71995Sopenharmony_ci } 665db71995Sopenharmony_ci void StartArray() { 675db71995Sopenharmony_ci CommaAndNewLine(); 685db71995Sopenharmony_ci Indent(); 695db71995Sopenharmony_ci output += "["; 705db71995Sopenharmony_ci stack.push(false); 715db71995Sopenharmony_ci } 725db71995Sopenharmony_ci void EndArray() { 735db71995Sopenharmony_ci stack.pop(); 745db71995Sopenharmony_ci output += "\n"; 755db71995Sopenharmony_ci Indent(); 765db71995Sopenharmony_ci output += "]"; 775db71995Sopenharmony_ci } 785db71995Sopenharmony_ci 795db71995Sopenharmony_ci void AddKeyedString(std::string const& key, std::string const& value) { 805db71995Sopenharmony_ci CommaAndNewLine(); 815db71995Sopenharmony_ci Indent(); 825db71995Sopenharmony_ci output += "\"" + key + "\": \"" + value + "\""; 835db71995Sopenharmony_ci } 845db71995Sopenharmony_ci void AddString(std::string const& value) { 855db71995Sopenharmony_ci CommaAndNewLine(); 865db71995Sopenharmony_ci Indent(); 875db71995Sopenharmony_ci output += "\"" + value + "\""; 885db71995Sopenharmony_ci } 895db71995Sopenharmony_ci 905db71995Sopenharmony_ci void AddKeyedBool(std::string const& key, bool value) { 915db71995Sopenharmony_ci CommaAndNewLine(); 925db71995Sopenharmony_ci Indent(); 935db71995Sopenharmony_ci output += "\"" + key + "\": " + (value ? "true" : "false"); 945db71995Sopenharmony_ci } 955db71995Sopenharmony_ci void AddBool(bool value) { 965db71995Sopenharmony_ci CommaAndNewLine(); 975db71995Sopenharmony_ci Indent(); 985db71995Sopenharmony_ci output += std::string(value ? "true" : "false"); 995db71995Sopenharmony_ci } 1005db71995Sopenharmony_ci 1015db71995Sopenharmony_ci private: 1025db71995Sopenharmony_ci void CommaAndNewLine() { 1035db71995Sopenharmony_ci if (stack.size() > 0) { 1045db71995Sopenharmony_ci if (stack.top() == false) { 1055db71995Sopenharmony_ci stack.top() = true; 1065db71995Sopenharmony_ci } else { 1075db71995Sopenharmony_ci output += ","; 1085db71995Sopenharmony_ci } 1095db71995Sopenharmony_ci output += "\n"; 1105db71995Sopenharmony_ci } 1115db71995Sopenharmony_ci } 1125db71995Sopenharmony_ci void Indent() { 1135db71995Sopenharmony_ci for (uint32_t i = 0; i < stack.size(); i++) { 1145db71995Sopenharmony_ci output += '\t'; 1155db71995Sopenharmony_ci } 1165db71995Sopenharmony_ci } 1175db71995Sopenharmony_ci}; 118