175930019STodd Fiala //===-- SBStructuredData.cpp ------------------------------------*- C++ -*-===//
275930019STodd Fiala //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
675930019STodd Fiala //
775930019STodd Fiala //===----------------------------------------------------------------------===//
875930019STodd Fiala 
975930019STodd Fiala #include "lldb/API/SBStructuredData.h"
10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
1175930019STodd Fiala 
1275930019STodd Fiala #include "lldb/API/SBStream.h"
133815e702SJim Ingham #include "lldb/API/SBStringList.h"
14d5d8d91cSRavitheja Addepally #include "lldb/Core/StructuredDataImpl.h"
1575930019STodd Fiala #include "lldb/Target/StructuredDataPlugin.h"
16181b823bSPavel Labath #include "lldb/Utility/Event.h"
1797206d57SZachary Turner #include "lldb/Utility/Status.h"
18bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
19f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
2075930019STodd Fiala 
2175930019STodd Fiala using namespace lldb;
2275930019STodd Fiala using namespace lldb_private;
2375930019STodd Fiala 
2475930019STodd Fiala #pragma mark--
2575930019STodd Fiala #pragma mark SBStructuredData
2675930019STodd Fiala 
27*baf5664fSJonas Devlieghere SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) {
28*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBStructuredData);
29*baf5664fSJonas Devlieghere }
3075930019STodd Fiala 
31b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs)
32*baf5664fSJonas Devlieghere     : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up.get())) {
33*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::SBStructuredData &),
34*baf5664fSJonas Devlieghere                           rhs);
35*baf5664fSJonas Devlieghere }
3675930019STodd Fiala 
37b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp)
38*baf5664fSJonas Devlieghere     : m_impl_up(new StructuredDataImpl(event_sp)) {
39*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::EventSP &), event_sp);
40*baf5664fSJonas Devlieghere }
4175930019STodd Fiala 
423815e702SJim Ingham SBStructuredData::SBStructuredData(lldb_private::StructuredDataImpl *impl)
43*baf5664fSJonas Devlieghere     : m_impl_up(impl) {
44*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData,
45*baf5664fSJonas Devlieghere                           (lldb_private::StructuredDataImpl *), impl);
46*baf5664fSJonas Devlieghere }
473815e702SJim Ingham 
48b9c1b51eSKate Stone SBStructuredData::~SBStructuredData() {}
4975930019STodd Fiala 
50b9c1b51eSKate Stone SBStructuredData &SBStructuredData::
51b9c1b51eSKate Stone operator=(const lldb::SBStructuredData &rhs) {
52*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
53*baf5664fSJonas Devlieghere       lldb::SBStructuredData &,
54*baf5664fSJonas Devlieghere       SBStructuredData, operator=,(const lldb::SBStructuredData &), rhs);
55*baf5664fSJonas Devlieghere 
5675930019STodd Fiala   *m_impl_up = *rhs.m_impl_up;
5775930019STodd Fiala   return *this;
5875930019STodd Fiala }
5975930019STodd Fiala 
60d5d8d91cSRavitheja Addepally lldb::SBError SBStructuredData::SetFromJSON(lldb::SBStream &stream) {
61*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON,
62*baf5664fSJonas Devlieghere                      (lldb::SBStream &), stream);
63*baf5664fSJonas Devlieghere 
64d5d8d91cSRavitheja Addepally   lldb::SBError error;
65d5d8d91cSRavitheja Addepally   std::string json_str(stream.GetData());
66d5d8d91cSRavitheja Addepally 
67d5d8d91cSRavitheja Addepally   StructuredData::ObjectSP json_obj = StructuredData::ParseJSON(json_str);
68d5d8d91cSRavitheja Addepally   m_impl_up->SetObjectSP(json_obj);
69d5d8d91cSRavitheja Addepally 
705bfee5f1SAbhishek Aggarwal   if (!json_obj || json_obj->GetType() != eStructuredDataTypeDictionary)
71d5d8d91cSRavitheja Addepally     error.SetErrorString("Invalid Syntax");
72*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
73d5d8d91cSRavitheja Addepally }
74d5d8d91cSRavitheja Addepally 
75*baf5664fSJonas Devlieghere bool SBStructuredData::IsValid() const {
76*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, IsValid);
7775930019STodd Fiala 
78*baf5664fSJonas Devlieghere   return m_impl_up->IsValid();
79*baf5664fSJonas Devlieghere }
80*baf5664fSJonas Devlieghere 
81*baf5664fSJonas Devlieghere void SBStructuredData::Clear() {
82*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBStructuredData, Clear);
83*baf5664fSJonas Devlieghere 
84*baf5664fSJonas Devlieghere   m_impl_up->Clear();
85*baf5664fSJonas Devlieghere }
8675930019STodd Fiala 
87b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const {
88*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON,
89*baf5664fSJonas Devlieghere                            (lldb::SBStream &), stream);
90*baf5664fSJonas Devlieghere 
91d5d8d91cSRavitheja Addepally   SBError error;
92d5d8d91cSRavitheja Addepally   error.SetError(m_impl_up->GetAsJSON(stream.ref()));
93*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(error);
9475930019STodd Fiala }
9575930019STodd Fiala 
96b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const {
97*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription,
98*baf5664fSJonas Devlieghere                            (lldb::SBStream &), stream);
99*baf5664fSJonas Devlieghere 
10097206d57SZachary Turner   Status error = m_impl_up->GetDescription(stream.ref());
1012ef442c6STodd Fiala   SBError sb_error;
1022ef442c6STodd Fiala   sb_error.SetError(error);
103*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_error);
10475930019STodd Fiala }
1055bfee5f1SAbhishek Aggarwal 
1065bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const {
107*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::StructuredDataType, SBStructuredData,
108*baf5664fSJonas Devlieghere                                    GetType);
109*baf5664fSJonas Devlieghere 
1105bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetType() : eStructuredDataTypeInvalid);
1115bfee5f1SAbhishek Aggarwal }
1125bfee5f1SAbhishek Aggarwal 
1135bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const {
114*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBStructuredData, GetSize);
115*baf5664fSJonas Devlieghere 
1165bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetSize() : 0);
1175bfee5f1SAbhishek Aggarwal }
1185bfee5f1SAbhishek Aggarwal 
1193815e702SJim Ingham bool SBStructuredData::GetKeys(lldb::SBStringList &keys) const {
120*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetKeys,
121*baf5664fSJonas Devlieghere                            (lldb::SBStringList &), keys);
122*baf5664fSJonas Devlieghere 
1233815e702SJim Ingham   if (!m_impl_up)
1243815e702SJim Ingham     return false;
1253815e702SJim Ingham 
1263815e702SJim Ingham   if (GetType() != eStructuredDataTypeDictionary)
1273815e702SJim Ingham     return false;
1283815e702SJim Ingham 
1293815e702SJim Ingham   StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP();
1303815e702SJim Ingham   if (!obj_sp)
1313815e702SJim Ingham     return false;
1323815e702SJim Ingham 
1333815e702SJim Ingham   StructuredData::Dictionary *dict = obj_sp->GetAsDictionary();
1343815e702SJim Ingham   // We claimed we were a dictionary, so this can't be null.
1353815e702SJim Ingham   assert(dict);
1363815e702SJim Ingham   // The return kind of GetKeys is an Array:
1373815e702SJim Ingham   StructuredData::ObjectSP array_sp = dict->GetKeys();
1383815e702SJim Ingham   StructuredData::Array *key_arr = array_sp->GetAsArray();
1393815e702SJim Ingham   assert(key_arr);
1403815e702SJim Ingham 
1413815e702SJim Ingham   key_arr->ForEach([&keys] (StructuredData::Object *object) -> bool {
1423815e702SJim Ingham     llvm::StringRef key = object->GetStringValue("");
1433815e702SJim Ingham     keys.AppendString(key.str().c_str());
1443815e702SJim Ingham     return true;
1453815e702SJim Ingham   });
1463815e702SJim Ingham   return true;
1473815e702SJim Ingham }
1483815e702SJim Ingham 
1495bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const {
150*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData,
151*baf5664fSJonas Devlieghere                            GetValueForKey, (const char *), key);
152*baf5664fSJonas Devlieghere 
1535bfee5f1SAbhishek Aggarwal   if (!m_impl_up)
154*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBStructuredData());
1555bfee5f1SAbhishek Aggarwal 
1565bfee5f1SAbhishek Aggarwal   SBStructuredData result;
1575bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key));
158*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
1595bfee5f1SAbhishek Aggarwal }
1605bfee5f1SAbhishek Aggarwal 
1615bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const {
162*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData,
163*baf5664fSJonas Devlieghere                            GetItemAtIndex, (size_t), idx);
164*baf5664fSJonas Devlieghere 
1655bfee5f1SAbhishek Aggarwal   if (!m_impl_up)
166*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBStructuredData());
1675bfee5f1SAbhishek Aggarwal 
1685bfee5f1SAbhishek Aggarwal   SBStructuredData result;
1695bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx));
170*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(result);
1715bfee5f1SAbhishek Aggarwal }
1725bfee5f1SAbhishek Aggarwal 
1735bfee5f1SAbhishek Aggarwal uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const {
174*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue,
175*baf5664fSJonas Devlieghere                            (uint64_t), fail_value);
176*baf5664fSJonas Devlieghere 
1775bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetIntegerValue(fail_value) : fail_value);
1785bfee5f1SAbhishek Aggarwal }
1795bfee5f1SAbhishek Aggarwal 
1805bfee5f1SAbhishek Aggarwal double SBStructuredData::GetFloatValue(double fail_value) const {
181*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double),
182*baf5664fSJonas Devlieghere                            fail_value);
183*baf5664fSJonas Devlieghere 
1845bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetFloatValue(fail_value) : fail_value);
1855bfee5f1SAbhishek Aggarwal }
1865bfee5f1SAbhishek Aggarwal 
1875bfee5f1SAbhishek Aggarwal bool SBStructuredData::GetBooleanValue(bool fail_value) const {
188*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool),
189*baf5664fSJonas Devlieghere                            fail_value);
190*baf5664fSJonas Devlieghere 
1915bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetBooleanValue(fail_value) : fail_value);
1925bfee5f1SAbhishek Aggarwal }
1935bfee5f1SAbhishek Aggarwal 
1945bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const {
195*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(size_t, SBStructuredData, GetStringValue,
196*baf5664fSJonas Devlieghere                            (char *, size_t), dst, dst_len);
197*baf5664fSJonas Devlieghere 
1985bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetStringValue(dst, dst_len) : 0);
1995bfee5f1SAbhishek Aggarwal }
200