StructuredDataImpl.h revision 321369
1238106Sdes//===-- StructuredDataImpl.h ------------------------------------*- C++ -*-===//
2238106Sdes//
3238106Sdes//                     The LLVM Compiler Infrastructure
4238106Sdes//
5238106Sdes// This file is distributed under the University of Illinois Open Source
6238106Sdes// License. See LICENSE.TXT for details.
7238106Sdes//
8238106Sdes//===----------------------------------------------------------------------===//
9238106Sdes
10238106Sdes#ifndef liblldb_StructuredDataImpl_h_
11238106Sdes#define liblldb_StructuredDataImpl_h_
12238106Sdes
13238106Sdes#include "lldb/Core/Event.h"
14238106Sdes#include "lldb/Target/StructuredDataPlugin.h"
15238106Sdes#include "lldb/Utility/Status.h"
16238106Sdes#include "lldb/Utility/Stream.h"
17238106Sdes#include "lldb/Utility/StructuredData.h"
18238106Sdes#include "lldb/lldb-enumerations.h"
19238106Sdes#include "lldb/lldb-forward.h"
20238106Sdes#include "llvm/ADT/StringRef.h"
21238106Sdes
22238106Sdes#pragma mark--
23238106Sdes#pragma mark StructuredDataImpl
24238106Sdes
25238106Sdesnamespace lldb_private {
26238106Sdes
27238106Sdesclass StructuredDataImpl {
28238106Sdespublic:
29238106Sdes  StructuredDataImpl() : m_plugin_wp(), m_data_sp() {}
30238106Sdes
31238106Sdes  StructuredDataImpl(const StructuredDataImpl &rhs) = default;
32238106Sdes
33238106Sdes  StructuredDataImpl(const lldb::EventSP &event_sp)
34238106Sdes      : m_plugin_wp(
35238106Sdes            EventDataStructuredData::GetPluginFromEvent(event_sp.get())),
36238106Sdes        m_data_sp(EventDataStructuredData::GetObjectFromEvent(event_sp.get())) {
37238106Sdes  }
38238106Sdes
39238106Sdes  ~StructuredDataImpl() = default;
40238106Sdes
41238106Sdes  StructuredDataImpl &operator=(const StructuredDataImpl &rhs) = default;
42238106Sdes
43238106Sdes  bool IsValid() const { return m_data_sp.get() != nullptr; }
44238106Sdes
45238106Sdes  void Clear() {
46238106Sdes    m_plugin_wp.reset();
47238106Sdes    m_data_sp.reset();
48238106Sdes  }
49238106Sdes
50238106Sdes  Status GetAsJSON(Stream &stream) const {
51238106Sdes    Status error;
52238106Sdes
53238106Sdes    if (!m_data_sp) {
54238106Sdes      error.SetErrorString("No structured data.");
55238106Sdes      return error;
56238106Sdes    }
57238106Sdes
58238106Sdes    m_data_sp->Dump(stream);
59238106Sdes    return error;
60238106Sdes  }
61238106Sdes
62238106Sdes  Status GetDescription(Stream &stream) const {
63238106Sdes    Status error;
64238106Sdes
65238106Sdes    if (!m_data_sp) {
66238106Sdes      error.SetErrorString("Cannot pretty print structured data: "
67238106Sdes                           "no data to print.");
68238106Sdes      return error;
69238106Sdes    }
70238106Sdes
71238106Sdes    // Grab the plugin.
72238106Sdes    auto plugin_sp = lldb::StructuredDataPluginSP(m_plugin_wp);
73238106Sdes    if (!plugin_sp) {
74238106Sdes      error.SetErrorString("Cannot pretty print structured data: "
75238106Sdes                           "plugin doesn't exist.");
76238106Sdes      return error;
77238106Sdes    }
78238106Sdes
79238106Sdes    // Get the data's description.
80238106Sdes    return plugin_sp->GetDescription(m_data_sp, stream);
81238106Sdes  }
82238106Sdes
83238106Sdes  StructuredData::ObjectSP GetObjectSP() { return m_data_sp; }
84238106Sdes
85238106Sdes  void SetObjectSP(const StructuredData::ObjectSP &obj) { m_data_sp = obj; }
86238106Sdes
87238106Sdes  lldb::StructuredDataType GetType() const {
88238106Sdes    return (m_data_sp ? m_data_sp->GetType() :
89238106Sdes        lldb::eStructuredDataTypeInvalid);
90238106Sdes  }
91238106Sdes
92238106Sdes  size_t GetSize() const {
93238106Sdes    if (!m_data_sp)
94238106Sdes      return 0;
95238106Sdes
96238106Sdes    if (m_data_sp->GetType() == lldb::eStructuredDataTypeDictionary) {
97238106Sdes      auto dict = m_data_sp->GetAsDictionary();
98238106Sdes      return (dict->GetSize());
99238106Sdes    } else if (m_data_sp->GetType() == lldb::eStructuredDataTypeArray) {
100238106Sdes      auto array = m_data_sp->GetAsArray();
101238106Sdes      return (array->GetSize());
102238106Sdes    } else
103238106Sdes      return 0;
104238106Sdes  }
105238106Sdes
106238106Sdes  StructuredData::ObjectSP GetValueForKey(const char *key) const {
107238106Sdes    if (m_data_sp) {
108238106Sdes      auto dict = m_data_sp->GetAsDictionary();
109238106Sdes      if (dict)
110238106Sdes        return dict->GetValueForKey(llvm::StringRef(key));
111238106Sdes    }
112238106Sdes    return StructuredData::ObjectSP();
113238106Sdes  }
114238106Sdes
115238106Sdes  StructuredData::ObjectSP GetItemAtIndex(size_t idx) const {
116238106Sdes    if (m_data_sp) {
117238106Sdes      auto array = m_data_sp->GetAsArray();
118238106Sdes      if (array)
119238106Sdes        return array->GetItemAtIndex(idx);
120238106Sdes    }
121238106Sdes    return StructuredData::ObjectSP();
122238106Sdes  }
123238106Sdes
124238106Sdes  uint64_t GetIntegerValue(uint64_t fail_value = 0) const {
125238106Sdes    return (m_data_sp ? m_data_sp->GetIntegerValue(fail_value) : fail_value);
126238106Sdes  }
127238106Sdes
128238106Sdes  double GetFloatValue(double fail_value = 0.0) const {
129238106Sdes    return (m_data_sp ? m_data_sp->GetFloatValue(fail_value) : fail_value);
130238106Sdes  }
131238106Sdes
132238106Sdes  bool GetBooleanValue(bool fail_value = false) const {
133238106Sdes    return (m_data_sp ? m_data_sp->GetBooleanValue(fail_value) : fail_value);
134238106Sdes  }
135238106Sdes
136238106Sdes  size_t GetStringValue(char *dst, size_t dst_len) const {
137238106Sdes    if (!m_data_sp)
138238106Sdes      return 0;
139238106Sdes
140238106Sdes    llvm::StringRef result = m_data_sp->GetStringValue();
141238106Sdes    if (result.empty())
142238106Sdes      return 0;
143238106Sdes
144238106Sdes    if (!dst || !dst_len) {
145238106Sdes      char s[1];
146238106Sdes      return (::snprintf(s, 1, "%s", result.data()));
147238106Sdes    }
148238106Sdes    return (::snprintf(dst, dst_len, "%s", result.data()));
149238106Sdes  }
150238106Sdes
151238106Sdesprivate:
152238106Sdes  lldb::StructuredDataPluginWP m_plugin_wp;
153238106Sdes  StructuredData::ObjectSP m_data_sp;
154238106Sdes};
155238106Sdes} // namespace lldb_private
156238106Sdes#endif
157238106Sdes