================
@@ -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

Reply via email to