StructuredDataImpl.h revision 353358
1//===-- StructuredDataImpl.h ------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef liblldb_StructuredDataImpl_h_
10#define liblldb_StructuredDataImpl_h_
11
12#include "lldb/Target/StructuredDataPlugin.h"
13#include "lldb/Utility/Event.h"
14#include "lldb/Utility/Status.h"
15#include "lldb/Utility/Stream.h"
16#include "lldb/Utility/StructuredData.h"
17#include "lldb/lldb-enumerations.h"
18#include "lldb/lldb-forward.h"
19#include "llvm/ADT/StringRef.h"
20
21#pragma mark--
22#pragma mark StructuredDataImpl
23
24namespace lldb_private {
25
26class StructuredDataImpl {
27public:
28  StructuredDataImpl() : m_plugin_wp(), m_data_sp() {}
29
30  StructuredDataImpl(const StructuredDataImpl &rhs) = default;
31
32  StructuredDataImpl(const lldb::EventSP &event_sp)
33      : m_plugin_wp(
34            EventDataStructuredData::GetPluginFromEvent(event_sp.get())),
35        m_data_sp(EventDataStructuredData::GetObjectFromEvent(event_sp.get())) {
36  }
37
38  ~StructuredDataImpl() = default;
39
40  StructuredDataImpl &operator=(const StructuredDataImpl &rhs) = default;
41
42  bool IsValid() const { return m_data_sp.get() != nullptr; }
43
44  void Clear() {
45    m_plugin_wp.reset();
46    m_data_sp.reset();
47  }
48
49  Status GetAsJSON(Stream &stream) const {
50    Status error;
51
52    if (!m_data_sp) {
53      error.SetErrorString("No structured data.");
54      return error;
55    }
56
57    m_data_sp->Dump(stream);
58    return error;
59  }
60
61  Status GetDescription(Stream &stream) const {
62    Status error;
63
64    if (!m_data_sp) {
65      error.SetErrorString("Cannot pretty print structured data: "
66                           "no data to print.");
67      return error;
68    }
69
70    // Grab the plugin.
71    auto plugin_sp = lldb::StructuredDataPluginSP(m_plugin_wp);
72    if (!plugin_sp) {
73      error.SetErrorString("Cannot pretty print structured data: "
74                           "plugin doesn't exist.");
75      return error;
76    }
77
78    // Get the data's description.
79    return plugin_sp->GetDescription(m_data_sp, stream);
80  }
81
82  StructuredData::ObjectSP GetObjectSP() { return m_data_sp; }
83
84  void SetObjectSP(const StructuredData::ObjectSP &obj) { m_data_sp = obj; }
85
86  lldb::StructuredDataType GetType() const {
87    return (m_data_sp ? m_data_sp->GetType() :
88        lldb::eStructuredDataTypeInvalid);
89  }
90
91  size_t GetSize() const {
92    if (!m_data_sp)
93      return 0;
94
95    if (m_data_sp->GetType() == lldb::eStructuredDataTypeDictionary) {
96      auto dict = m_data_sp->GetAsDictionary();
97      return (dict->GetSize());
98    } else if (m_data_sp->GetType() == lldb::eStructuredDataTypeArray) {
99      auto array = m_data_sp->GetAsArray();
100      return (array->GetSize());
101    } else
102      return 0;
103  }
104
105  StructuredData::ObjectSP GetValueForKey(const char *key) const {
106    if (m_data_sp) {
107      auto dict = m_data_sp->GetAsDictionary();
108      if (dict)
109        return dict->GetValueForKey(llvm::StringRef(key));
110    }
111    return StructuredData::ObjectSP();
112  }
113
114  StructuredData::ObjectSP GetItemAtIndex(size_t idx) const {
115    if (m_data_sp) {
116      auto array = m_data_sp->GetAsArray();
117      if (array)
118        return array->GetItemAtIndex(idx);
119    }
120    return StructuredData::ObjectSP();
121  }
122
123  uint64_t GetIntegerValue(uint64_t fail_value = 0) const {
124    return (m_data_sp ? m_data_sp->GetIntegerValue(fail_value) : fail_value);
125  }
126
127  double GetFloatValue(double fail_value = 0.0) const {
128    return (m_data_sp ? m_data_sp->GetFloatValue(fail_value) : fail_value);
129  }
130
131  bool GetBooleanValue(bool fail_value = false) const {
132    return (m_data_sp ? m_data_sp->GetBooleanValue(fail_value) : fail_value);
133  }
134
135  size_t GetStringValue(char *dst, size_t dst_len) const {
136    if (!m_data_sp)
137      return 0;
138
139    llvm::StringRef result = m_data_sp->GetStringValue();
140    if (result.empty())
141      return 0;
142
143    if (!dst || !dst_len) {
144      char s[1];
145      return (::snprintf(s, 1, "%s", result.data()));
146    }
147    return (::snprintf(dst, dst_len, "%s", result.data()));
148  }
149
150private:
151  lldb::StructuredDataPluginWP m_plugin_wp;
152  StructuredData::ObjectSP m_data_sp;
153};
154} // namespace lldb_private
155#endif
156