180814287SRaphael Isemann //===-- SBStructuredData.cpp ----------------------------------------------===//
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"
10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.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 
27baf5664fSJonas Devlieghere SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) {
28baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBStructuredData);
29baf5664fSJonas Devlieghere }
3075930019STodd Fiala 
31b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs)
32c5cf4b8fSDave Lee     : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up)) {
33baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::SBStructuredData &),
34baf5664fSJonas Devlieghere                           rhs);
35baf5664fSJonas Devlieghere }
3675930019STodd Fiala 
37b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp)
38baf5664fSJonas Devlieghere     : m_impl_up(new StructuredDataImpl(event_sp)) {
39baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData, (const lldb::EventSP &), event_sp);
40baf5664fSJonas Devlieghere }
4175930019STodd Fiala 
4282de8df2SPavel Labath SBStructuredData::SBStructuredData(const lldb_private::StructuredDataImpl &impl)
4382de8df2SPavel Labath     : m_impl_up(new StructuredDataImpl(impl)) {
44baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBStructuredData,
4582de8df2SPavel Labath                           (const lldb_private::StructuredDataImpl &), impl);
46baf5664fSJonas Devlieghere }
473815e702SJim Ingham 
48866b7a65SJonas Devlieghere SBStructuredData::~SBStructuredData() = default;
4975930019STodd Fiala 
50b9c1b51eSKate Stone SBStructuredData &SBStructuredData::
51b9c1b51eSKate Stone operator=(const lldb::SBStructuredData &rhs) {
52baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(
53baf5664fSJonas Devlieghere       lldb::SBStructuredData &,
54baf5664fSJonas Devlieghere       SBStructuredData, operator=,(const lldb::SBStructuredData &), rhs);
55baf5664fSJonas Devlieghere 
5675930019STodd Fiala   *m_impl_up = *rhs.m_impl_up;
57*d232abc3SJonas Devlieghere   return *this;
5875930019STodd Fiala }
5975930019STodd Fiala 
60d5d8d91cSRavitheja Addepally lldb::SBError SBStructuredData::SetFromJSON(lldb::SBStream &stream) {
61baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON,
62baf5664fSJonas Devlieghere                      (lldb::SBStream &), stream);
63baf5664fSJonas 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*d232abc3SJonas Devlieghere   return error;
73d5d8d91cSRavitheja Addepally }
74d5d8d91cSRavitheja Addepally 
75bf9f21a2SWalter Erquinigo lldb::SBError SBStructuredData::SetFromJSON(const char *json) {
76bf9f21a2SWalter Erquinigo   LLDB_RECORD_METHOD(lldb::SBError, SBStructuredData, SetFromJSON,
77bf9f21a2SWalter Erquinigo                      (const char *), json);
78bf9f21a2SWalter Erquinigo   lldb::SBStream s;
79bf9f21a2SWalter Erquinigo   s.Print(json);
80*d232abc3SJonas Devlieghere   return SetFromJSON(s);
81bf9f21a2SWalter Erquinigo }
82bf9f21a2SWalter Erquinigo 
83baf5664fSJonas Devlieghere bool SBStructuredData::IsValid() const {
84baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, IsValid);
857f5237bcSPavel Labath   return this->operator bool();
867f5237bcSPavel Labath }
87bf9f21a2SWalter Erquinigo 
887f5237bcSPavel Labath SBStructuredData::operator bool() const {
897f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStructuredData, operator bool);
9075930019STodd Fiala 
91baf5664fSJonas Devlieghere   return m_impl_up->IsValid();
92baf5664fSJonas Devlieghere }
93baf5664fSJonas Devlieghere 
94baf5664fSJonas Devlieghere void SBStructuredData::Clear() {
95baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBStructuredData, Clear);
96baf5664fSJonas Devlieghere 
97baf5664fSJonas Devlieghere   m_impl_up->Clear();
98baf5664fSJonas Devlieghere }
9975930019STodd Fiala 
100b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const {
101baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetAsJSON,
102baf5664fSJonas Devlieghere                            (lldb::SBStream &), stream);
103baf5664fSJonas Devlieghere 
104d5d8d91cSRavitheja Addepally   SBError error;
105d5d8d91cSRavitheja Addepally   error.SetError(m_impl_up->GetAsJSON(stream.ref()));
106*d232abc3SJonas Devlieghere   return error;
10775930019STodd Fiala }
10875930019STodd Fiala 
109b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const {
110baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBError, SBStructuredData, GetDescription,
111baf5664fSJonas Devlieghere                            (lldb::SBStream &), stream);
112baf5664fSJonas Devlieghere 
11397206d57SZachary Turner   Status error = m_impl_up->GetDescription(stream.ref());
1142ef442c6STodd Fiala   SBError sb_error;
1152ef442c6STodd Fiala   sb_error.SetError(error);
116*d232abc3SJonas Devlieghere   return sb_error;
11775930019STodd Fiala }
1185bfee5f1SAbhishek Aggarwal 
1195bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const {
120baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::StructuredDataType, SBStructuredData,
121baf5664fSJonas Devlieghere                                    GetType);
122baf5664fSJonas Devlieghere 
123c5cf4b8fSDave Lee   return m_impl_up->GetType();
1245bfee5f1SAbhishek Aggarwal }
1255bfee5f1SAbhishek Aggarwal 
1265bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const {
127baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBStructuredData, GetSize);
128baf5664fSJonas Devlieghere 
129c5cf4b8fSDave Lee   return m_impl_up->GetSize();
1305bfee5f1SAbhishek Aggarwal }
1315bfee5f1SAbhishek Aggarwal 
1323815e702SJim Ingham bool SBStructuredData::GetKeys(lldb::SBStringList &keys) const {
133baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetKeys,
134baf5664fSJonas Devlieghere                            (lldb::SBStringList &), keys);
135baf5664fSJonas Devlieghere 
1363815e702SJim Ingham   if (GetType() != eStructuredDataTypeDictionary)
1373815e702SJim Ingham     return false;
1383815e702SJim Ingham 
1393815e702SJim Ingham   StructuredData::ObjectSP obj_sp = m_impl_up->GetObjectSP();
1403815e702SJim Ingham   if (!obj_sp)
1413815e702SJim Ingham     return false;
1423815e702SJim Ingham 
1433815e702SJim Ingham   StructuredData::Dictionary *dict = obj_sp->GetAsDictionary();
1443815e702SJim Ingham   // We claimed we were a dictionary, so this can't be null.
1453815e702SJim Ingham   assert(dict);
1463815e702SJim Ingham   // The return kind of GetKeys is an Array:
1473815e702SJim Ingham   StructuredData::ObjectSP array_sp = dict->GetKeys();
1483815e702SJim Ingham   StructuredData::Array *key_arr = array_sp->GetAsArray();
1493815e702SJim Ingham   assert(key_arr);
1503815e702SJim Ingham 
1513815e702SJim Ingham   key_arr->ForEach([&keys] (StructuredData::Object *object) -> bool {
1523815e702SJim Ingham     llvm::StringRef key = object->GetStringValue("");
1533815e702SJim Ingham     keys.AppendString(key.str().c_str());
1543815e702SJim Ingham     return true;
1553815e702SJim Ingham   });
1563815e702SJim Ingham   return true;
1573815e702SJim Ingham }
1583815e702SJim Ingham 
1595bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const {
160baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData,
161baf5664fSJonas Devlieghere                            GetValueForKey, (const char *), key);
162baf5664fSJonas Devlieghere 
1635bfee5f1SAbhishek Aggarwal   SBStructuredData result;
1645bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key));
165*d232abc3SJonas Devlieghere   return result;
1665bfee5f1SAbhishek Aggarwal }
1675bfee5f1SAbhishek Aggarwal 
1685bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const {
169baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBStructuredData, SBStructuredData,
170baf5664fSJonas Devlieghere                            GetItemAtIndex, (size_t), idx);
171baf5664fSJonas Devlieghere 
1725bfee5f1SAbhishek Aggarwal   SBStructuredData result;
1735bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx));
174*d232abc3SJonas Devlieghere   return result;
1755bfee5f1SAbhishek Aggarwal }
1765bfee5f1SAbhishek Aggarwal 
1775bfee5f1SAbhishek Aggarwal uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const {
178baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint64_t, SBStructuredData, GetIntegerValue,
179baf5664fSJonas Devlieghere                            (uint64_t), fail_value);
180baf5664fSJonas Devlieghere 
181c5cf4b8fSDave Lee   return m_impl_up->GetIntegerValue(fail_value);
1825bfee5f1SAbhishek Aggarwal }
1835bfee5f1SAbhishek Aggarwal 
1845bfee5f1SAbhishek Aggarwal double SBStructuredData::GetFloatValue(double fail_value) const {
185baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(double, SBStructuredData, GetFloatValue, (double),
186baf5664fSJonas Devlieghere                            fail_value);
187baf5664fSJonas Devlieghere 
188c5cf4b8fSDave Lee   return m_impl_up->GetFloatValue(fail_value);
1895bfee5f1SAbhishek Aggarwal }
1905bfee5f1SAbhishek Aggarwal 
1915bfee5f1SAbhishek Aggarwal bool SBStructuredData::GetBooleanValue(bool fail_value) const {
192baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBStructuredData, GetBooleanValue, (bool),
193baf5664fSJonas Devlieghere                            fail_value);
194baf5664fSJonas Devlieghere 
195c5cf4b8fSDave Lee   return m_impl_up->GetBooleanValue(fail_value);
1965bfee5f1SAbhishek Aggarwal }
1975bfee5f1SAbhishek Aggarwal 
1985bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const {
199e687aa82SJonas Devlieghere   LLDB_RECORD_CHAR_PTR_METHOD_CONST(size_t, SBStructuredData, GetStringValue,
200e687aa82SJonas Devlieghere                                     (char *, size_t), dst, "", dst_len);
201baf5664fSJonas Devlieghere 
202c5cf4b8fSDave Lee   return m_impl_up->GetStringValue(dst, dst_len);
2035bfee5f1SAbhishek Aggarwal }
204