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