================
@@ -0,0 +1,231 @@
+//===-- Protocol.cpp 
------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "Protocol.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/JSON.h"
+#include <optional>
+#include <utility>
+
+using namespace llvm;
+
+static bool mapRaw(const json::Value &Params, StringLiteral Prop,
+                   std::optional<json::Value> &V, json::Path P) {
+  const auto *O = Params.getAsObject();
+  if (!O) {
+    P.report("expected object");
+    return false;
+  }
+  if (const json::Value *E = O->get(Prop))
+    V = std::move(Params);
+  return true;
+}
+
+namespace lldb_dap {
+namespace protocol {
+
+enum class MessageType { request, response, event };
+
+bool fromJSON(const json::Value &Params, MessageType &M, json::Path P) {
+  auto rawType = Params.getAsString();
+  if (!rawType) {
+    P.report("expected a string");
+    return false;
+  }
+  std::optional<MessageType> type =
+      StringSwitch<std::optional<MessageType>>(*rawType)
+          .Case("request", MessageType::request)
+          .Case("response", MessageType::response)
+          .Case("event", MessageType::event)
+          .Default(std::nullopt);
+  if (!type) {
+    P.report("unexpected value, expected 'request', 'response' or 'event'");
+    return false;
+  }
+  M = *type;
+  return true;
+}
+
+json::Value toJSON(const Request &R) {
+  json::Object Result{
+      {"type", "request"},
+      {"seq", R.seq},
+      {"command", R.command},
+  };
+
+  if (R.rawArguments)
+    Result.insert({"arguments", R.rawArguments});
+
+  return std::move(Result);
+}
+
+bool fromJSON(json::Value const &Params, Request &R, json::Path P) {
+  json::ObjectMapper O(Params, P);
+  if (!O)
+    return false;
+
+  MessageType type;
+  if (!O.map("type", type) || !O.map("command", R.command) ||
+      !O.map("seq", R.seq))
+    return false;
+
+  if (type != MessageType::request) {
+    P.field("type").report("expected to be 'request'");
+    return false;
+  }
+
+  if (R.command.empty()) {
+    P.field("command").report("expected to not be ''");
+    return false;
+  }
+
+  if (!R.seq) {
+    P.field("seq").report("expected to not be '0'");
+    return false;
+  }
+
+  return mapRaw(Params, "arguments", R.rawArguments, P);
+}
+
+json::Value toJSON(const Response &R) {
+  json::Object Result{{"type", "response"},
+                      {"req", 0},
+                      {"command", R.command},
+                      {"request_seq", R.request_seq},
+                      {"success", R.success}};
+
+  if (R.message)
+    Result.insert({"message", R.message});
+
+  if (R.rawBody)
+    Result.insert({"body", R.rawBody});
+
+  return std::move(Result);
+}
+
+bool fromJSON(json::Value const &Params, Response &R, json::Path P) {
+  json::ObjectMapper O(Params, P);
+  if (!O)
+    return false;
+
+  MessageType type;
+  int64_t seq;
+  if (!O.map("type", type) || !O.map("seq", seq) ||
+      !O.map("command", R.command) || !O.map("request_seq", R.request_seq))
+    return false;
+
+  if (type != MessageType::response) {
+    P.field("type").report("expected to be 'response'");
+    return false;
+  }
+
+  if (seq != 0) {
+    P.field("seq").report("expected to be '0'");
+    return false;
+  }
+
+  if (R.command.empty()) {
+    P.field("command").report("expected to not be ''");
+    return false;
+  }
+
+  if (R.request_seq == 0) {
+    P.field("request_seq").report("expected to not be '0'");
+    return false;
+  }
+
+  return O.map("success", R.success) && O.mapOptional("message", R.message) &&
+         mapRaw(Params, "body", R.rawBody, P);
+}
+
+json::Value toJSON(const Event &E) {
+  json::Object Result{
+      {"type", "event"},
+      {"seq", 0},
+      {"event", E.event},
+  };
+
+  if (E.rawBody)
+    Result.insert({"body", E.rawBody});
+
+  if (E.statistics)
+    Result.insert({"statistics", E.statistics});
----------------
vogelsgesang wrote:

can we break the current behavior here, and move the statistics into the 
`body`, e.g. under a `$__lldb_extension_statistics` key? That would allow us to 
remove this adhoc "statistics" parameter here

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

Reply via email to