JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
request.cpp
Go to the documentation of this file.
2
3namespace jsonrpc::endpoint {
4
5using error::RpcError;
7
9 std::string method, std::optional<nlohmann::json> params,
10 const std::function<RequestId()>& id_generator)
11 : method_(std::move(method)),
12 params_(std::move(params)),
13 is_notification_(false),
14 id_(id_generator()) {
15}
16
18 std::string method, std::optional<nlohmann::json> params, RequestId id)
19 : method_(std::move(method)),
20 params_(std::move(params)),
21 is_notification_(false),
22 id_(std::move(id)) {
23}
24
25Request::Request(std::string method, std::optional<nlohmann::json> params)
26 : method_(std::move(method)),
27 params_(std::move(params)),
28 is_notification_(true) { // No ID for notifications
29}
30
31auto Request::FromJson(const nlohmann::json& json_obj)
32 -> std::expected<Request, error::RpcError> {
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") ||
42 (json_obj["jsonrpc"].get<std::string>() != kJsonRpcVersion)) {
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)); // Notification
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
76 RequestId id;
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}
85
86auto Request::RequiresResponse() const -> bool {
87 return !is_notification_;
88}
89
90auto Request::GetId() const -> RequestId {
91 return id_;
92}
93
94auto Request::ToJson() const -> nlohmann::json {
95 nlohmann::json json_obj;
96 json_obj["jsonrpc"] = kJsonRpcVersion;
97 json_obj["method"] = method_;
98
99 if (params_.has_value()) {
100 json_obj["params"] = params_.value();
101 }
102
103 if (!is_notification_) {
104 if (std::holds_alternative<int64_t>(id_)) {
105 json_obj["id"] = std::get<int64_t>(id_);
106 } else {
107 json_obj["id"] = std::get<std::string>(id_);
108 }
109 }
110
111 return json_obj;
112}
113
114} // namespace jsonrpc::endpoint
auto GetId() const -> RequestId
Definition request.cpp:90
auto RequiresResponse() const -> bool
Definition request.cpp:86
auto ToJson() const -> nlohmann::json
Definition request.cpp:94
Request(std::string method, std::optional< nlohmann::json > params, const std::function< RequestId()> &id_generator)
Definition request.cpp:8
static auto FromJson(const nlohmann::json &json_obj) -> std::expected< Request, error::RpcError >
Definition request.cpp:31
static auto UnexpectedFromCode(RpcErrorCode code, std::string message="") -> std::unexpected< RpcError >
Definition error.hpp:101
std::variant< int64_t, std::string > RequestId
Definition types.hpp:15
constexpr std::string_view kJsonRpcVersion
Definition types.hpp:13