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") || 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)); // Notification
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
75 RequestId id;
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}
84
85auto Request::RequiresResponse() const -> bool {
86 return !is_notification_;
87}
88
89auto Request::GetId() const -> RequestId {
90 return id_;
91}
92
93auto Request::ToJson() const -> nlohmann::json {
94 nlohmann::json json_obj;
95 json_obj["jsonrpc"] = kJsonRpcVersion;
96 json_obj["method"] = method_;
97
98 if (params_.has_value()) {
99 json_obj["params"] = params_.value();
100 }
101
102 if (!is_notification_) {
103 if (std::holds_alternative<int64_t>(id_)) {
104 json_obj["id"] = std::get<int64_t>(id_);
105 } else {
106 json_obj["id"] = std::get<std::string>(id_);
107 }
108 }
109
110 return json_obj;
111}
112
113} // namespace jsonrpc::endpoint
auto GetId() const -> RequestId
Definition request.cpp:89
auto RequiresResponse() const -> bool
Definition request.cpp:85
auto ToJson() const -> nlohmann::json
Definition request.cpp:93
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