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