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") ||
44 RpcErrorCode::kInvalidRequest, "Missing or invalid 'jsonrpc' version");
45 }
46
47 if (!json_obj.contains("method") || !json_obj["method"].is_string()) {
49 RpcErrorCode::kInvalidRequest, "Missing or invalid 'method'");
50 }
51
52 auto method = json_obj["method"].get<std::string>();
53 auto params = json_obj.contains("params")
54 ? std::optional<nlohmann::json>(json_obj["params"])
55 : std::nullopt;
56
57 if (json_obj.contains("params")) {
58 const auto& p = json_obj["params"];
59 if (!p.is_array() && !p.is_object() && !p.is_null()) {
61 RpcErrorCode::kInvalidRequest,
62 "'params' must be object, array, or null");
63 }
64 }
65
66 if (!json_obj.contains("id")) {
67 return Request(std::move(method), std::move(params));
68 }
69
70 const auto& id_json = json_obj["id"];
71 if (!id_json.is_string() && !id_json.is_number_integer()) {
73 RpcErrorCode::kInvalidRequest, "Invalid 'id' type");
74 }
75
77 if (id_json.is_string()) {
78 id = id_json.get<std::string>();
79 } else {
80 id = id_json.get<int64_t>();
81 }
82
83 return Request(std::move(method), std::move(params), std::move(
id));
84}
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