//===-- ScriptedHookPythonInterface.h ---------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDHOOKPYTHONINTERFACE_H
#define LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDHOOKPYTHONINTERFACE_H

#include "lldb/Interpreter/Interfaces/ScriptedHookInterface.h"

#include "ScriptedPythonInterface.h"

namespace lldb_private {
class ScriptedHookPythonInterface : public ScriptedHookInterface,
                                    public ScriptedPythonInterface,
                                    public PluginInterface {
public:
  ScriptedHookPythonInterface(ScriptInterpreterPythonImpl &interpreter);

  llvm::Expected<StructuredData::GenericSP>
  CreatePluginObject(const ScriptedMetadata &scripted_metadata,
                     lldb::TargetSP target_sp) override;

  /// `handle_stop` is required so a hook can always be attached via
  /// `target stop-hook add -P`. `handle_module_loaded` and
  /// `handle_module_unloaded` are optional; if a hook doesn't implement
  /// them, the corresponding events are simply not delivered.
  llvm::SmallVector<AbstractMethodRequirement>
  GetAbstractMethodRequirements() const override {
    return llvm::SmallVector<AbstractMethodRequirement>({{"handle_stop", 2}});
  }

  llvm::SmallVector<llvm::StringLiteral> GetOptionalMethods() const override {
    return {"handle_module_loaded", "handle_module_unloaded"};
  }

  /// Check which of the three hook methods the Python class implements.
  SupportedHookMethods GetSupportedMethods() override;

  llvm::Error HandleModuleLoaded(lldb::StreamSP &output_sp) override;
  llvm::Error HandleModuleUnloaded(lldb::StreamSP &output_sp) override;
  llvm::Expected<bool> HandleStop(ExecutionContext &exe_ctx,
                                  lldb::StreamSP &output_sp) override;

  static void Initialize();
  static void Terminate();

  static llvm::StringRef GetPluginNameStatic() {
    return "ScriptedHookPythonInterface";
  }

  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
};
} // namespace lldb_private

#endif // LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDHOOKPYTHONINTERFACE_H
