From 90f62b13d6e96dc54f33c9f9d6602b0dbcc1357b Mon Sep 17 00:00:00 2001
From: phesch <ulila@student.kit.edu>
Date: Tue, 22 Feb 2022 18:02:24 +0100
Subject: [PATCH] Fix easy JSON exporter for untyped data exports

---
 .../tree_visitors/TreeTypedJSONConverter.cpp  | 32 +++++++++++++++++--
 .../tree_visitors/TreeTypedJSONConverter.h    |  2 ++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
index d0f2f4c77..f80717342 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
@@ -4,10 +4,10 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include <RobotAPI/libraries/aron/core/data/variant/All.h>
-#include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 
 namespace armarx::armem::gui::instance
 {
@@ -27,6 +27,34 @@ namespace armarx::armem::gui::instance
         return obj;
     }
 
+    /* We override this method because we need to handle untyped members in the hierarchy.
+     * The other get*Elements() methods will either not be called with a null type or can handle it.
+     */
+    TreeTypedJSONConverter::MapElements
+    TreeTypedJSONConverter::getObjectElements(DataInput& elementData, TypeInput& elementType)
+    {
+        std::map<std::string, std::pair<aron::data::VariantPtr, aron::type::VariantPtr>> ret;
+        auto data = aron::data::Dict::DynamicCastAndCheck(elementData);
+        auto type = aron::type::Object::DynamicCastAndCheck(elementType);
+
+        if (data)
+        {
+            for (const auto& [key, e] : data->getElements())
+            {
+                if (type && type->hasMemberType(key))
+                {
+                    auto memberType = type->getMemberType(key);
+                    ret.insert({key, {e, memberType}});
+                }
+                else
+                {
+                    ret.insert({key, {e, nullptr}});
+                }
+            }
+        }
+        return ret;
+    }
+
     void
     TreeTypedJSONConverter::visitObjectOnEnter(DataInput& elementData, TypeInput& /*elementType*/)
     {
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
index 7a112979e..901021de0 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
@@ -17,6 +17,8 @@ namespace armarx::armem::gui::instance
 
         const nlohmann::json& getJSON();
 
+        MapElements getObjectElements(DataInput& elementData, TypeInput& elementType) override;
+
         void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override;
         void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override;
         void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) override;
-- 
GitLab