From ae356980c4b845038c90d94849857f0108ac435b Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Mon, 30 Aug 2021 14:11:00 +0200
Subject: [PATCH] UTILS: Add a json builder object to hold some useful
 functionalities like create a QJsonArray that will be interpreted as an
 ordered QJsonObject by the property viewer

---
 src/Lib/JsonBuilder.cc | 25 +++++++++++++++++++++++++
 src/Lib/JsonBuilder.hh | 31 +++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 src/Lib/JsonBuilder.cc
 create mode 100644 src/Lib/JsonBuilder.hh

diff --git a/src/Lib/JsonBuilder.cc b/src/Lib/JsonBuilder.cc
new file mode 100644
index 00000000..105445ea
--- /dev/null
+++ b/src/Lib/JsonBuilder.cc
@@ -0,0 +1,25 @@
+#include "JsonBuilder.hh"
+
+using namespace Vivy;
+
+QJsonArray
+JsonBuilder::createOrderedJsonObject(
+    std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept
+{
+    QJsonArray ret;
+    int index = 0;
+
+    for (const QPair<QString, QJsonValue> &elem : elements) {
+        ret.insert(index, QJsonObject({ elem }));
+        ++index;
+    }
+
+    return ret;
+}
+
+QJsonDocument
+JsonBuilder::createOrderedJsonDocument(
+    std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept
+{
+    return QJsonDocument(createOrderedJsonObject(elements));
+}
diff --git a/src/Lib/JsonBuilder.hh b/src/Lib/JsonBuilder.hh
new file mode 100644
index 00000000..4534b463
--- /dev/null
+++ b/src/Lib/JsonBuilder.hh
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "Utils.hh"
+
+namespace Vivy
+{
+// Struct used to englobe all json build facilities. This is a class used as a
+// private-able namespace that can't be 'using' and thus create unreadable
+// code. You can't build this thing, everything is static inside.
+struct JsonBuilder final {
+    VIVY_UNMOVABLE_OBJECT(JsonBuilder)
+
+    static QJsonArray
+    createOrderedJsonObject(std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept;
+
+    static QJsonDocument
+    createOrderedJsonDocument(std::initializer_list<QPair<QString, QJsonValue>> elements) noexcept;
+
+    template <PropertyConstViewable T> static QPair<QString, QJsonValue>
+    getSubDocumentJson(const QString &name, std::shared_ptr<T> subDocPtr) noexcept
+    {
+        if (subDocPtr == nullptr)
+            return QPair{ name, QJsonValue() };
+        else
+            return QPair{ name, subDocPtr->getProperties().object() };
+    }
+
+private:
+    JsonBuilder() noexcept {}
+};
+}
-- 
GitLab