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") ||
44 RpcErrorCode::kInvalidRequest,
"Missing or invalid 'jsonrpc' version");
47 if (!json_obj.contains(
"method") || !json_obj[
"method"].is_string()) {
49 RpcErrorCode::kInvalidRequest,
"Missing or invalid 'method'");
52 auto method = json_obj[
"method"].get<std::string>();
53 auto params = json_obj.contains(
"params")
54 ? std::optional<nlohmann::json>(json_obj[
"params"])
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");
66 if (!json_obj.contains(
"id")) {
67 return Request(std::move(method), std::move(params));
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");
77 if (id_json.is_string()) {
78 id = id_json.get<std::string>();
80 id = id_json.get<int64_t>();
83 return Request(std::move(method), std::move(params), std::move(
id));