From 6ba9c04f7068c42d00783d1b5ad2f5a358f4ea32 Mon Sep 17 00:00:00 2001
From: Christoph Pohl <christoph.pohl@kit.edu>
Date: Thu, 16 Feb 2023 15:24:30 +0100
Subject: [PATCH] handle optional subtypes in fullfillsType

---
 .../aron/core/data/variant/container/Dict.cpp | 27 ++++++++++++++++---
 .../aron/core/data/variant/container/List.cpp |  7 ++++-
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
index 478c6a2c8..09cab7521 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/Dict.cpp
@@ -25,10 +25,12 @@
 #include "Dict.h"
 
 // ArmarX
-#include <RobotAPI/libraries/aron/core/data/variant/Factory.h>
-
 #include <SimoxUtility/algorithm/string/string_conversion.h>
 
+#include <ArmarXCore/util/CPPUtility/trace.h>
+
+#include <RobotAPI/libraries/aron/core/data/variant/Factory.h>
+
 namespace armarx::aron::data
 {
 
@@ -216,19 +218,35 @@ namespace armarx::aron::data
         {
             case type::Descriptor::OBJECT:
             {
+                ARMARX_TRACE;
                 auto objectTypeNav = type::Object::DynamicCastAndCheck(type);
                 for (const auto& [key, nav] : childrenNavigators)
                 {
                     if (!objectTypeNav->hasMemberType(key))
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
-                    if (!nav || !objectTypeNav->getMemberType(key))
+                    if (!objectTypeNav->getMemberType(key))
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
+
+                    if (!nav)
+                    {
+                        ARMARX_TRACE;
+                        auto childTypeNav = objectTypeNav->getMemberType(key);
+                        if (childTypeNav->getMaybe() == type::Maybe::NONE)
+                        {
+                            ARMARX_TRACE;
+                            return false;
+                        }
+                        return true;
+                    }
                     if (!nav->fullfillsType(objectTypeNav->getMemberType(key)))
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
                 }
@@ -236,16 +254,19 @@ namespace armarx::aron::data
             }
             case type::Descriptor::DICT:
             {
+                ARMARX_TRACE;
                 auto dictTypeNav = type::Dict::DynamicCastAndCheck(type);
                 for (const auto& [key, nav] : childrenNavigators)
                 {
                     (void) key;
                     if (!nav || !dictTypeNav->getAcceptedType())
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
                     if (!nav->fullfillsType(dictTypeNav->getAcceptedType()))
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
                 }
diff --git a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
index 84bf1a200..db80996a1 100644
--- a/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
+++ b/source/RobotAPI/libraries/aron/core/data/variant/container/List.cpp
@@ -26,10 +26,12 @@
 
 // ArmarX
 #include <ArmarXCore/core/exceptions/Exception.h>
+#include <ArmarXCore/util/CPPUtility/trace.h>
+
 #include <RobotAPI/libraries/aron/core/data/variant/Factory.h>
 #include <RobotAPI/libraries/aron/core/type/variant/container/List.h>
-#include <RobotAPI/libraries/aron/core/type/variant/container/Tuple.h>
 #include <RobotAPI/libraries/aron/core/type/variant/container/Pair.h>
+#include <RobotAPI/libraries/aron/core/type/variant/container/Tuple.h>
 
 namespace armarx::aron::data
 {
@@ -218,15 +220,18 @@ namespace armarx::aron::data
         {
             case type::Descriptor::LIST:
             {
+                ARMARX_TRACE;
                 auto listTypeNav = type::List::DynamicCastAndCheck(type);
                 for (const auto& nav : childrenNavigators)
                 {
                     if (!nav && !listTypeNav->getAcceptedType())
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
                     if (!nav->fullfillsType(listTypeNav->getAcceptedType()))
                     {
+                        ARMARX_TRACE;
                         return false;
                     }
                 }
-- 
GitLab