32 -> std::expected<Request, error::RpcError> {
36 if (!json_obj.is_object()) {
38 RpcErrorCode::kInvalidRequest,
"Request must be a JSON object");
41 if (!json_obj.contains(
"jsonrpc") || json_obj[
"jsonrpc"] !=
kJsonRpcVersion) {
43 RpcErrorCode::kInvalidRequest,
"Missing or invalid 'jsonrpc' version");
46 if (!json_obj.contains(
"method") || !json_obj[
"method"].is_string()) {
48 RpcErrorCode::kInvalidRequest,
"Missing or invalid 'method'");
51 auto method = json_obj[
"method"].get<std::string>();
52 auto params = json_obj.contains(
"params")
53 ? std::optional<nlohmann::json>(json_obj[
"params"])
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");
65 if (!json_obj.contains(
"id")) {
66 return Request(std::move(method), std::move(params));
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");
76 if (id_json.is_string()) {
77 id = id_json.get<std::string>();
79 id = id_json.get<int64_t>();
82 return Request(std::move(method), std::move(params), std::move(
id));