================
@@ -177,48 +172,71 @@ class RequestHandler : public BaseRequestHandler {
/// *NOTE*: PostRun will be invoked even if the `Run` operation returned an
/// error.
virtual void PostRun() const {};
+};
- void HandleErrorResponse(llvm::Error err,
- protocol::Response &response) const {
- response.success = false;
- llvm::handleAllErrors(
- std::move(err),
- [&](const NotStoppedError &err) {
- response.message = lldb_dap::protocol::eResponseMessageNotStopped;
- },
- [&](const DAPError &err) {
- protocol::ErrorMessage error_message;
- error_message.sendTelemetry = false;
- error_message.format = err.getMessage();
- error_message.showUser = err.getShowUser();
- error_message.id = err.convertToErrorCode().value();
- error_message.url = err.getURL();
- error_message.urlLabel = err.getURLLabel();
- protocol::ErrorResponseBody body;
- body.error = error_message;
- response.body = body;
- },
- [&](const llvm::ErrorInfoBase &err) {
- protocol::ErrorMessage error_message;
- error_message.showUser = true;
- error_message.sendTelemetry = false;
- error_message.format = err.message();
- error_message.id = err.convertToErrorCode().value();
- protocol::ErrorResponseBody body;
- body.error = error_message;
- response.body = body;
- });
- }
+/// Base class for handling DAP requests. Handlers should declare their
+/// arguments and response body types like:
+///
+/// class MyRequestHandler : public AsyncRequestHandler<Arguments, Response> {
+/// ....
+/// };
+template <typename Args, typename Resp>
+class AsyncRequestHandler : public BaseRequestHandler {
+ using BaseRequestHandler::BaseRequestHandler;
+
+ void operator()(const protocol::Request &request) const override {
+ protocol::Response response;
+ response.request_seq = request.seq;
+ response.command = request.command;
+
+ llvm::Expected<Args> arguments = parseArgs<Args>(request);
+ if (llvm::Error err = arguments.takeError()) {
+ HandleErrorResponse(std::move(err), response);
+ dap.Send(response);
+ return;
+ }
+
+ if constexpr (std::is_same_v<Resp, llvm::Error>) {
+ Run(*arguments, [this, response](llvm::Error err) mutable {
+ lldb::SBMutex lock = dap.GetAPIMutex();
+ std::lock_guard<lldb::SBMutex> guard(lock);
+
+ if (err)
+ HandleErrorResponse(std::move(err), response);
+ else
+ response.success = true;
+
+ Send(response);
+ });
+ } else {
+ Run(*arguments, [this, response](Resp body) mutable {
+ lldb::SBMutex lock = dap.GetAPIMutex();
+ std::lock_guard<lldb::SBMutex> guard(lock);
+
+ if (llvm::Error err = body.takeError())
+ HandleErrorResponse(std::move(err), response);
+ else {
----------------
JDevlieghere wrote:
```suggestion
if (llvm::Error err = body.takeError()) {
HandleErrorResponse(std::move(err), response);
} else {
```
https://github.com/llvm/llvm-project/pull/171549
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits