1 //===-- ScriptedInterface.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 LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
10 #define LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
11 
12 #include "lldb/Core/StructuredDataImpl.h"
13 #include "lldb/Target/ExecutionContext.h"
14 #include "lldb/Utility/LLDBLog.h"
15 #include "lldb/Utility/Log.h"
16 #include "lldb/Utility/UnimplementedError.h"
17 #include "lldb/lldb-private.h"
18 
19 #include "llvm/Support/Compiler.h"
20 
21 #include <string>
22 
23 namespace lldb_private {
24 class ScriptedInterface {
25 public:
26   ScriptedInterface() = default;
27   virtual ~ScriptedInterface() = default;
28 
29   StructuredData::GenericSP GetScriptObjectInstance() {
30     return m_object_instance_sp;
31   }
32 
33   virtual llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const = 0;
34 
35   template <typename Ret>
36   static Ret ErrorWithMessage(llvm::StringRef caller_name,
37                               llvm::StringRef error_msg, Status &error,
38                               LLDBLog log_caterogy = LLDBLog::Process) {
39     LLDB_LOGF(GetLog(log_caterogy), "%s ERROR = %s", caller_name.data(),
40               error_msg.data());
41     std::string full_error_message =
42         llvm::Twine(caller_name + llvm::Twine(" ERROR = ") +
43                     llvm::Twine(error_msg))
44             .str();
45     if (const char *detailed_error = error.AsCString())
46       full_error_message +=
47           llvm::Twine(llvm::Twine(" (") + llvm::Twine(detailed_error) +
48                       llvm::Twine(")"))
49               .str();
50     error.SetErrorString(full_error_message);
51     return {};
52   }
53 
54   template <typename T = StructuredData::ObjectSP>
55   bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) {
56     if (!obj)
57       return ErrorWithMessage<bool>(caller, "Null Structured Data object",
58                                     error);
59 
60     if (!obj->IsValid()) {
61       return ErrorWithMessage<bool>(caller, "Invalid StructuredData object",
62                                     error);
63     }
64 
65     if (error.Fail())
66       return ErrorWithMessage<bool>(caller, error.AsCString(), error);
67 
68     return true;
69   }
70 
71 protected:
72   StructuredData::GenericSP m_object_instance_sp;
73 };
74 } // namespace lldb_private
75 #endif // LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
76