32 {
33 using error::RpcError;
35
36 if (!json_obj.is_object()) {
38 RpcErrorCode::kInvalidRequest, "Request must be a JSON object");
39 }
40
41 if (!json_obj.contains(
"jsonrpc") || json_obj[
"jsonrpc"] !=
kJsonRpcVersion) {
43 RpcErrorCode::kInvalidRequest, "Missing or invalid 'jsonrpc' version");
44 }
45
46 if (!json_obj.contains("method") || !json_obj["method"].is_string()) {
48 RpcErrorCode::kInvalidRequest, "Missing or invalid 'method'");
49 }
50
51 auto method = json_obj["method"].get<std::string>();
52 auto params = json_obj.contains("params")
53 ? std::optional<nlohmann::json>(json_obj["params"])
54 : std::nullopt;
55
56 if (json_obj.contains("params")) {
57 const auto& p = json_obj["params"];
58 if (!p.is_array() && !p.is_object() && !p.is_null()) {
60 RpcErrorCode::kInvalidRequest,
61 "'params' must be object, array, or null");
62 }
63 }
64
65 if (!json_obj.contains("id")) {
66 return Request(std::move(method), std::move(params));
67 }
68
69 const auto& id_json = json_obj["id"];
70 if (!id_json.is_string() && !id_json.is_number_integer()) {
72 RpcErrorCode::kInvalidRequest, "Invalid 'id' type");
73 }
74
76 if (id_json.is_string()) {
77 id = id_json.get<std::string>();
78 } else {
79 id = id_json.get<int64_t>();
80 }
81
82 return Request(std::move(method), std::move(params), std::move(
id));
83}
Request(std::string method, std::optional< nlohmann::json > params, const std::function< RequestId()> &id_generator)
static auto UnexpectedFromCode(RpcErrorCode code, std::string message="") -> std::unexpected< RpcError >
std::variant< int64_t, std::string > RequestId
constexpr std::string_view kJsonRpcVersion