#ifndef LLDB_TOOLS_LLDB_DAP_RUNINTERMINAL_H
#define LLDB_TOOLS_LLDB_DAP_RUNINTERMINAL_H
#include "FifoFiles.h"
#include <future>
#include <thread>
namespace lldb_dap {
enum RunInTerminalMessageKind {
eRunInTerminalMessageKindPID = 0,
eRunInTerminalMessageKindError,
eRunInTerminalMessageKindDidAttach,
};
struct RunInTerminalMessage;
struct RunInTerminalMessagePid;
struct RunInTerminalMessageError;
struct RunInTerminalMessageDidAttach;
struct RunInTerminalMessage {
RunInTerminalMessage(RunInTerminalMessageKind kind);
virtual ~RunInTerminalMessage() = default;
virtual llvm::json::Value ToJSON() const = 0;
const RunInTerminalMessagePid *GetAsPidMessage() const;
const RunInTerminalMessageError *GetAsErrorMessage() const;
RunInTerminalMessageKind kind;
};
using RunInTerminalMessageUP = std::unique_ptr<RunInTerminalMessage>;
struct RunInTerminalMessagePid : RunInTerminalMessage {
RunInTerminalMessagePid(lldb::pid_t pid);
llvm::json::Value ToJSON() const override;
lldb::pid_t pid;
};
struct RunInTerminalMessageError : RunInTerminalMessage {
RunInTerminalMessageError(llvm::StringRef error);
llvm::json::Value ToJSON() const override;
std::string error;
};
struct RunInTerminalMessageDidAttach : RunInTerminalMessage {
RunInTerminalMessageDidAttach();
llvm::json::Value ToJSON() const override;
};
class RunInTerminalLauncherCommChannel {
public:
RunInTerminalLauncherCommChannel(llvm::StringRef comm_file);
llvm::Error WaitUntilDebugAdaptorAttaches(std::chrono::milliseconds timeout);
llvm::Error NotifyPid();
void NotifyError(llvm::StringRef error);
private:
FifoFileIO m_io;
};
class RunInTerminalDebugAdapterCommChannel {
public:
RunInTerminalDebugAdapterCommChannel(llvm::StringRef comm_file);
std::future<lldb::SBError> NotifyDidAttach();
llvm::Expected<lldb::pid_t> GetLauncherPid();
std::string GetLauncherError();
private:
FifoFileIO m_io;
};
llvm::Expected<std::shared_ptr<FifoFile>> CreateRunInTerminalCommFile();
}
#endif