JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
response.cpp
Go to the documentation of this file.
2
4
5namespace jsonrpc::endpoint {
6
8
9auto Response::FromJson(const nlohmann::json& json)
10 -> std::expected<Response, error::RpcError> {
11 Response r{json};
12 if (auto result = r.ValidateResponse(); !result) {
13 return std::unexpected(result.error());
14 }
15 return r;
16}
17
19 const nlohmann::json& result, const std::optional<RequestId>& id)
20 -> Response {
21 nlohmann::json response = {{"jsonrpc", kJsonRpcVersion}, {"result", result}};
22 if (id) {
23 std::visit([&response](const auto& v) { response["id"] = v; }, *id);
24 }
25 return Response{std::move(response)};
26}
27
29 RpcErrorCode code, const std::optional<RequestId>& id) -> Response {
30 RpcError err = RpcError::FromCode(code);
31
32 nlohmann::json error = {
33 {"code", static_cast<int>(err.Code())}, {"message", err.Message()}};
34 nlohmann::json response = {{"jsonrpc", kJsonRpcVersion}, {"error", error}};
35 if (id) {
36 std::visit([&response](const auto& v) { response["id"] = v; }, *id);
37 } else {
38 response["id"] = nullptr;
39 }
40 return Response{std::move(response)};
41}
42
44 const RpcError& error, const std::optional<RequestId>& id) -> Response {
45 nlohmann::json error_json = error.to_json();
46 return CreateError(error_json, id);
47}
48
50 const nlohmann::json& error, const std::optional<RequestId>& id)
51 -> Response {
52 nlohmann::json response = {{"jsonrpc", kJsonRpcVersion}, {"error", error}};
53 if (id) {
54 std::visit([&response](const auto& v) { response["id"] = v; }, *id);
55 }
56 return Response{std::move(response)};
57}
58
59auto Response::IsSuccess() const -> bool {
60 return response_.contains("result");
61}
62
63auto Response::GetResult() const -> const nlohmann::json& {
64 if (!IsSuccess()) {
65 throw std::runtime_error("Response is not a success response");
66 }
67 return response_["result"];
68}
69
70auto Response::GetError() const -> const nlohmann::json& {
71 if (IsSuccess()) {
72 throw std::runtime_error("Response is not an error response");
73 }
74 return response_["error"];
75}
76
77auto Response::GetId() const -> std::optional<RequestId> {
78 if (!response_.contains("id") || response_["id"].is_null()) {
79 return std::nullopt;
80 }
81
82 const auto& id = response_["id"];
83 if (id.is_string()) {
84 return id.get<std::string>();
85 }
86 return id.get<int64_t>();
87}
88
89auto Response::ToJson() const -> nlohmann::json {
90 return response_;
91}
92
93auto Response::ValidateResponse() const
94 -> std::expected<void, error::RpcError> {
95 if (!response_.contains("jsonrpc") ||
96 response_["jsonrpc"] != kJsonRpcVersion) {
98 RpcErrorCode::kInvalidRequest, "Invalid JSON-RPC version");
99 }
100
101 if (!response_.contains("result") && !response_.contains("error")) {
103 RpcErrorCode::kInvalidRequest,
104 "Response must contain either 'result' or 'error' field");
105 }
106
107 if (response_.contains("result") && response_.contains("error")) {
109 RpcErrorCode::kInvalidRequest,
110 "Response cannot contain both 'result' and 'error' fields");
111 }
112
113 if (response_.contains("error")) {
114 const auto& error = response_["error"];
115 if (!error.contains("code") || !error.contains("message")) {
117 RpcErrorCode::kInvalidRequest,
118 "Error object must contain 'code' and 'message' fields");
119 }
120 }
121
122 return {};
123}
124
125} // namespace jsonrpc::endpoint
static auto CreateSuccess(const nlohmann::json &result, const std::optional< RequestId > &id) -> Response
Definition response.cpp:18
auto GetResult() const -> const nlohmann::json &
Definition response.cpp:63
static auto CreateError(RpcErrorCode code, const std::optional< RequestId > &id=std::nullopt) -> Response
Definition response.cpp:28
auto GetId() const -> std::optional< RequestId >
Definition response.cpp:77
static auto FromJson(const nlohmann::json &json) -> std::expected< Response, error::RpcError >
Definition response.cpp:9
auto IsSuccess() const -> bool
Definition response.cpp:59
auto GetError() const -> const nlohmann::json &
Definition response.cpp:70
auto ToJson() const -> nlohmann::json
Definition response.cpp:89
static auto FromCode(RpcErrorCode code, std::string message="") -> RpcError
Definition error.hpp:93
auto Code() const -> RpcErrorCode
Definition error.hpp:77
auto Message() const -> std::string
Definition error.hpp:81
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