175930019STodd Fiala //===-- SBStructuredData.cpp ------------------------------------*- C++ -*-===//
275930019STodd Fiala //
375930019STodd Fiala //                     The LLVM Compiler Infrastructure
475930019STodd Fiala //
575930019STodd Fiala // This file is distributed under the University of Illinois Open Source
675930019STodd Fiala // License. See LICENSE.TXT for details.
775930019STodd Fiala //
875930019STodd Fiala //===----------------------------------------------------------------------===//
975930019STodd Fiala 
1075930019STodd Fiala #include "lldb/API/SBStructuredData.h"
1175930019STodd Fiala 
1275930019STodd Fiala #include "lldb/API/SBStream.h"
1375930019STodd Fiala #include "lldb/Core/Event.h"
1475930019STodd Fiala #include "lldb/Core/StructuredData.h"
15d5d8d91cSRavitheja Addepally #include "lldb/Core/StructuredDataImpl.h"
1675930019STodd Fiala #include "lldb/Target/StructuredDataPlugin.h"
1797206d57SZachary Turner #include "lldb/Utility/Status.h"
18bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1975930019STodd Fiala 
2075930019STodd Fiala using namespace lldb;
2175930019STodd Fiala using namespace lldb_private;
2275930019STodd Fiala 
2375930019STodd Fiala #pragma mark--
2475930019STodd Fiala #pragma mark SBStructuredData
2575930019STodd Fiala 
262ef442c6STodd Fiala SBStructuredData::SBStructuredData() : m_impl_up(new StructuredDataImpl()) {}
2775930019STodd Fiala 
28b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::SBStructuredData &rhs)
292ef442c6STodd Fiala     : m_impl_up(new StructuredDataImpl(*rhs.m_impl_up.get())) {}
3075930019STodd Fiala 
31b9c1b51eSKate Stone SBStructuredData::SBStructuredData(const lldb::EventSP &event_sp)
322ef442c6STodd Fiala     : m_impl_up(new StructuredDataImpl(event_sp)) {}
3375930019STodd Fiala 
34b9c1b51eSKate Stone SBStructuredData::~SBStructuredData() {}
3575930019STodd Fiala 
36b9c1b51eSKate Stone SBStructuredData &SBStructuredData::
37b9c1b51eSKate Stone operator=(const lldb::SBStructuredData &rhs) {
3875930019STodd Fiala   *m_impl_up = *rhs.m_impl_up;
3975930019STodd Fiala   return *this;
4075930019STodd Fiala }
4175930019STodd Fiala 
42d5d8d91cSRavitheja Addepally lldb::SBError SBStructuredData::SetFromJSON(lldb::SBStream &stream) {
43d5d8d91cSRavitheja Addepally   lldb::SBError error;
44d5d8d91cSRavitheja Addepally   std::string json_str(stream.GetData());
45d5d8d91cSRavitheja Addepally 
46d5d8d91cSRavitheja Addepally   StructuredData::ObjectSP json_obj = StructuredData::ParseJSON(json_str);
47d5d8d91cSRavitheja Addepally   m_impl_up->SetObjectSP(json_obj);
48d5d8d91cSRavitheja Addepally 
49*5bfee5f1SAbhishek Aggarwal   if (!json_obj || json_obj->GetType() != eStructuredDataTypeDictionary)
50d5d8d91cSRavitheja Addepally     error.SetErrorString("Invalid Syntax");
51d5d8d91cSRavitheja Addepally   return error;
52d5d8d91cSRavitheja Addepally }
53d5d8d91cSRavitheja Addepally 
54b9c1b51eSKate Stone bool SBStructuredData::IsValid() const { return m_impl_up->IsValid(); }
5575930019STodd Fiala 
56b9c1b51eSKate Stone void SBStructuredData::Clear() { m_impl_up->Clear(); }
5775930019STodd Fiala 
58b9c1b51eSKate Stone SBError SBStructuredData::GetAsJSON(lldb::SBStream &stream) const {
59d5d8d91cSRavitheja Addepally   SBError error;
60d5d8d91cSRavitheja Addepally   error.SetError(m_impl_up->GetAsJSON(stream.ref()));
61d5d8d91cSRavitheja Addepally   return error;
6275930019STodd Fiala }
6375930019STodd Fiala 
64b9c1b51eSKate Stone lldb::SBError SBStructuredData::GetDescription(lldb::SBStream &stream) const {
6597206d57SZachary Turner   Status error = m_impl_up->GetDescription(stream.ref());
662ef442c6STodd Fiala   SBError sb_error;
672ef442c6STodd Fiala   sb_error.SetError(error);
682ef442c6STodd Fiala   return sb_error;
6975930019STodd Fiala }
70*5bfee5f1SAbhishek Aggarwal 
71*5bfee5f1SAbhishek Aggarwal StructuredDataType SBStructuredData::GetType() const {
72*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetType() : eStructuredDataTypeInvalid);
73*5bfee5f1SAbhishek Aggarwal }
74*5bfee5f1SAbhishek Aggarwal 
75*5bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetSize() const {
76*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetSize() : 0);
77*5bfee5f1SAbhishek Aggarwal }
78*5bfee5f1SAbhishek Aggarwal 
79*5bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetValueForKey(const char *key) const {
80*5bfee5f1SAbhishek Aggarwal   if (!m_impl_up)
81*5bfee5f1SAbhishek Aggarwal     return SBStructuredData();
82*5bfee5f1SAbhishek Aggarwal 
83*5bfee5f1SAbhishek Aggarwal   SBStructuredData result;
84*5bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetValueForKey(key));
85*5bfee5f1SAbhishek Aggarwal   return result;
86*5bfee5f1SAbhishek Aggarwal }
87*5bfee5f1SAbhishek Aggarwal 
88*5bfee5f1SAbhishek Aggarwal lldb::SBStructuredData SBStructuredData::GetItemAtIndex(size_t idx) const {
89*5bfee5f1SAbhishek Aggarwal   if (!m_impl_up)
90*5bfee5f1SAbhishek Aggarwal     return SBStructuredData();
91*5bfee5f1SAbhishek Aggarwal 
92*5bfee5f1SAbhishek Aggarwal   SBStructuredData result;
93*5bfee5f1SAbhishek Aggarwal   result.m_impl_up->SetObjectSP(m_impl_up->GetItemAtIndex(idx));
94*5bfee5f1SAbhishek Aggarwal   return result;
95*5bfee5f1SAbhishek Aggarwal }
96*5bfee5f1SAbhishek Aggarwal 
97*5bfee5f1SAbhishek Aggarwal uint64_t SBStructuredData::GetIntegerValue(uint64_t fail_value) const {
98*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetIntegerValue(fail_value) : fail_value);
99*5bfee5f1SAbhishek Aggarwal }
100*5bfee5f1SAbhishek Aggarwal 
101*5bfee5f1SAbhishek Aggarwal double SBStructuredData::GetFloatValue(double fail_value) const {
102*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetFloatValue(fail_value) : fail_value);
103*5bfee5f1SAbhishek Aggarwal }
104*5bfee5f1SAbhishek Aggarwal 
105*5bfee5f1SAbhishek Aggarwal bool SBStructuredData::GetBooleanValue(bool fail_value) const {
106*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetBooleanValue(fail_value) : fail_value);
107*5bfee5f1SAbhishek Aggarwal }
108*5bfee5f1SAbhishek Aggarwal 
109*5bfee5f1SAbhishek Aggarwal size_t SBStructuredData::GetStringValue(char *dst, size_t dst_len) const {
110*5bfee5f1SAbhishek Aggarwal   return (m_impl_up ? m_impl_up->GetStringValue(dst, dst_len) : 0);
111*5bfee5f1SAbhishek Aggarwal }
112