1111
1212#include < rtl/rtl_typeid.h>
1313#include < detail/inc/ReflectCast.hpp>
14+ #include < detail/inc/RObjectUPtr.h>
1415
1516namespace rtl ::detail
1617{
@@ -20,10 +21,23 @@ namespace rtl::detail
2021 {
2122 const auto & conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
2223 {
23- pNewEntityKind = EntityKind::Ptr;
24- const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
25- const auto & srcObj = (isPtr ? *std::any_cast<const std::string*>(pSrc) : std::any_cast<const std::string&>(pSrc));
26- return std::any (srcObj.c_str ());
24+ try {
25+ pNewEntityKind = EntityKind::Ptr;
26+ const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
27+ if (pSrcEntityKind == EntityKind::Wrapper) {
28+ // TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
29+ const auto & srcRUptr = std::any_cast<const RObjectUPtr<std::string>&>(pSrc);
30+ return std::any (srcRUptr.get ()->c_str ());
31+ }
32+ else {
33+ const auto & srcObj = (isPtr ? *std::any_cast<const std::string*>(pSrc) : std::any_cast<const std::string&>(pSrc));
34+ return std::any (srcObj.c_str ());
35+ }
36+ }
37+ catch (std::exception e) {
38+ pNewEntityKind = EntityKind::None;
39+ return std::any ();
40+ }
2741 };
2842 conversions ().emplace_back (std::pair (traits::uid<char >::value, conversion));
2943 }
@@ -35,10 +49,23 @@ namespace rtl::detail
3549 {
3650 const auto & conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
3751 {
38- pNewEntityKind = EntityKind::Ptr;
39- const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
40- const auto & srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
41- return std::any (srcObj.data ());
52+ try {
53+ pNewEntityKind = EntityKind::Ptr;
54+ const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
55+ if (pSrcEntityKind == EntityKind::Wrapper) {
56+ // TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
57+ const auto & srcRUptr = std::any_cast<const RObjectUPtr<std::string>&>(pSrc);
58+ return std::any (srcRUptr.get ()->data ());
59+ }
60+ else {
61+ const auto & srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
62+ return std::any (srcObj.data ());
63+ }
64+ }
65+ catch (std::exception e) {
66+ pNewEntityKind = EntityKind::None;
67+ return std::any ();
68+ }
4269 };
4370 conversions ().emplace_back (std::pair (traits::uid<char >::value, conversion));
4471 }
@@ -51,10 +78,23 @@ namespace rtl::detail
5178 using _toType = std::string;
5279 const auto & conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
5380 {
54- pNewEntityKind = EntityKind::Value;
55- const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
56- const auto & srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
57- return std::any (_toType (srcObj));
81+ try {
82+ pNewEntityKind = EntityKind::Value;
83+ const auto & isPtr = (pSrcEntityKind == EntityKind::Ptr);
84+ if (pSrcEntityKind == EntityKind::Wrapper) {
85+ // TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
86+ const auto & srcRUptr = std::any_cast<const RObjectUPtr<std::string_view>&>(pSrc);
87+ return std::any (_toType (*srcRUptr.get ()));
88+ }
89+ else {
90+ const auto & srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
91+ return std::any (_toType (srcObj));
92+ }
93+ }
94+ catch (std::exception e) {
95+ pNewEntityKind = EntityKind::None;
96+ return std::any ();
97+ }
5898 };
5999 conversions ().emplace_back (std::pair (traits::uid<_toType>::value, conversion));
60100 }
0 commit comments