================
@@ -57,235 +68,288 @@ class RequestHandler {
   DAP &dap;
 };
 
-class AttachRequestHandler : public RequestHandler {
-public:
-  using RequestHandler::RequestHandler;
+/// Base class for handling DAP requests. Handlers should declare their
+/// arguments and response body types like:
+///
+/// class MyRequestHandler : public RequestHandler<Arguments, ResponseBody> {
+///   ....
+/// };
+template <typename Args, typename Body>
+class RequestHandler : public BaseRequestHandler {
+  using BaseRequestHandler::BaseRequestHandler;
+
+  void operator()(const llvm::json::Object &request) const override {
+    /* no-op, the other overload handles json coding. */
+  }
+
+  void operator()(const protocol::Request &request) const override {
+    protocol::Response response;
+    response.request_seq = request.seq;
+    response.command = request.command;
+    Args arguments;
+    llvm::json::Path::Root root;
+    if (request.rawArguments &&
+        !fromJSON(request.rawArguments, arguments, root)) {
----------------
vogelsgesang wrote:

> although all the existing request's require an argument today.

Afaict, the 
[BreakpointLocationsArguments](https://microsoft.github.io/debug-adapter-protocol/specification#Requests_BreakpointLocations),
 
[ConfigurationDone](https://microsoft.github.io/debug-adapter-protocol/specification#Requests_ConfigurationDone),
 
[Disconnect](https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Disconnect),
 
[RestartRequest](https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Restart)
 and a couple more all have an optional `arguments` parameter.

Initially, I thought we would some commands which always take arguments and 
some commands which never accept arguments. Apparently, I was wrong. Instead, 
we apparently have commands which *optionally* accept arguments, and commands 
which always expect arguments, but no commands which never accept arguments.

I think we should produce a clear error message for commands which miss their 
required arguments.
Not sure how we want to model the distinction between optional and required 
arguments? Maybe something like the following distinction?

```
/// Requires `arguments` to be provided
/// Not providing `arguments` is an error
class MyRequestHandler : public RequestHandler<Arguments, ResponseBody> {

/// `arguments` are optional
class MyRequestHandler : public RequestHandler<std::optional<Arguments>, 
ResponseBody> {
```

https://github.com/llvm/llvm-project/pull/130090
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to