1 //===-- StructuredDataImpl.h ------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_StructuredDataImpl_h_
11 #define liblldb_StructuredDataImpl_h_
13 #include "lldb/Core/Event.h"
14 #include "lldb/Core/StructuredData.h"
15 #include "lldb/Target/StructuredDataPlugin.h"
16 #include "lldb/Utility/Status.h"
17 #include "lldb/Utility/Stream.h"
18 #include "lldb/lldb-enumerations.h"
19 #include "lldb/lldb-forward.h"
20 #include "llvm/ADT/StringRef.h"
23 #pragma mark StructuredDataImpl
25 namespace lldb_private {
27 class StructuredDataImpl {
29 StructuredDataImpl() : m_plugin_wp(), m_data_sp() {}
31 StructuredDataImpl(const StructuredDataImpl &rhs) = default;
33 StructuredDataImpl(const lldb::EventSP &event_sp)
35 EventDataStructuredData::GetPluginFromEvent(event_sp.get())),
36 m_data_sp(EventDataStructuredData::GetObjectFromEvent(event_sp.get())) {
39 ~StructuredDataImpl() = default;
41 StructuredDataImpl &operator=(const StructuredDataImpl &rhs) = default;
43 bool IsValid() const { return m_data_sp.get() != nullptr; }
50 Status GetAsJSON(Stream &stream) const {
54 error.SetErrorString("No structured data.");
58 m_data_sp->Dump(stream);
62 Status GetDescription(Stream &stream) const {
66 error.SetErrorString("Cannot pretty print structured data: "
72 auto plugin_sp = lldb::StructuredDataPluginSP(m_plugin_wp);
74 error.SetErrorString("Cannot pretty print structured data: "
75 "plugin doesn't exist.");
79 // Get the data's description.
80 return plugin_sp->GetDescription(m_data_sp, stream);
83 StructuredData::ObjectSP GetObjectSP() { return m_data_sp; }
85 void SetObjectSP(const StructuredData::ObjectSP &obj) { m_data_sp = obj; }
87 lldb::StructuredDataType GetType() const {
88 return (m_data_sp ? m_data_sp->GetType() :
89 lldb::eStructuredDataTypeInvalid);
92 size_t GetSize() const {
96 if (m_data_sp->GetType() == lldb::eStructuredDataTypeDictionary) {
97 auto dict = m_data_sp->GetAsDictionary();
98 return (dict->GetSize());
99 } else if (m_data_sp->GetType() == lldb::eStructuredDataTypeArray) {
100 auto array = m_data_sp->GetAsArray();
101 return (array->GetSize());
106 StructuredData::ObjectSP GetValueForKey(const char *key) const {
108 auto dict = m_data_sp->GetAsDictionary();
110 return dict->GetValueForKey(llvm::StringRef(key));
112 return StructuredData::ObjectSP();
115 StructuredData::ObjectSP GetItemAtIndex(size_t idx) const {
117 auto array = m_data_sp->GetAsArray();
119 return array->GetItemAtIndex(idx);
121 return StructuredData::ObjectSP();
124 uint64_t GetIntegerValue(uint64_t fail_value = 0) const {
125 return (m_data_sp ? m_data_sp->GetIntegerValue(fail_value) : fail_value);
128 double GetFloatValue(double fail_value = 0.0) const {
129 return (m_data_sp ? m_data_sp->GetFloatValue(fail_value) : fail_value);
132 bool GetBooleanValue(bool fail_value = false) const {
133 return (m_data_sp ? m_data_sp->GetBooleanValue(fail_value) : fail_value);
136 size_t GetStringValue(char *dst, size_t dst_len) const {
140 llvm::StringRef result = m_data_sp->GetStringValue();
144 if (!dst || !dst_len) {
146 return (::snprintf(s, 1, "%s", result.data()));
148 return (::snprintf(dst, dst_len, "%s", result.data()));
152 lldb::StructuredDataPluginWP m_plugin_wp;
153 StructuredData::ObjectSP m_data_sp;
155 } // namespace lldb_private