JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
jsonrpc::endpoint::Request Class Reference

#include <request.hpp>

Collaboration diagram for jsonrpc::endpoint::Request:

Public Member Functions

 Request (std::string method, std::optional< nlohmann::json > params, const std::function< RequestId()> &id_generator)
 
 Request (std::string method, std::optional< nlohmann::json > params, RequestId id)
 
 Request (std::string method, std::optional< nlohmann::json > params=std::nullopt)
 
auto GetMethod () const -> const std::string &
 
auto GetParams () const -> const std::optional< nlohmann::json > &
 
auto IsNotification () const -> bool
 
auto RequiresResponse () const -> bool
 
auto GetId () const -> RequestId
 
auto Dump () const -> std::string
 
auto ToJson () const -> nlohmann::json
 

Static Public Member Functions

static auto FromJson (const nlohmann::json &json_obj) -> std::expected< Request, error::RpcError >
 

Detailed Description

Definition at line 15 of file request.hpp.

Constructor & Destructor Documentation

◆ Request() [1/3]

jsonrpc::endpoint::Request::Request ( std::string method,
std::optional< nlohmann::json > params,
const std::function< RequestId()> & id_generator )

Definition at line 8 of file request.cpp.

11 : method_(std::move(method)),
12 params_(std::move(params)),
13 is_notification_(false),
14 id_(id_generator()) {
15}

◆ Request() [2/3]

jsonrpc::endpoint::Request::Request ( std::string method,
std::optional< nlohmann::json > params,
RequestId id )

Definition at line 17 of file request.cpp.

19 : method_(std::move(method)),
20 params_(std::move(params)),
21 is_notification_(false),
22 id_(std::move(id)) {
23}

◆ Request() [3/3]

jsonrpc::endpoint::Request::Request ( std::string method,
std::optional< nlohmann::json > params = std::nullopt )
explicit

Definition at line 25 of file request.cpp.

26 : method_(std::move(method)),
27 params_(std::move(params)),
28 is_notification_(true) { // No ID for notifications
29}

Member Function Documentation

◆ Dump()

auto jsonrpc::endpoint::Request::Dump ( ) const -> std::string
nodiscard

◆ FromJson()

auto jsonrpc::endpoint::Request::FromJson ( const nlohmann::json & json_obj) -> std::expected<Request, error::RpcError>
static

Definition at line 31 of file request.cpp.

32 {
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}
Request(std::string method, std::optional< nlohmann::json > params, const std::function< RequestId()> &id_generator)
Definition request.cpp:8
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

References jsonrpc::endpoint::kJsonRpcVersion, and jsonrpc::error::RpcError::UnexpectedFromCode().

Referenced by jsonrpc::endpoint::Dispatcher::DispatchRequest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetId()

auto jsonrpc::endpoint::Request::GetId ( ) const -> RequestId
nodiscard

Definition at line 90 of file request.cpp.

90 {
91 return id_;
92}

◆ GetMethod()

auto jsonrpc::endpoint::Request::GetMethod ( ) const -> const std::string&
inlinenodiscard

Definition at line 30 of file request.hpp.

30 {
31 return method_;
32 }

◆ GetParams()

auto jsonrpc::endpoint::Request::GetParams ( ) const -> const std::optional<nlohmann::json>&
inlinenodiscard

Definition at line 34 of file request.hpp.

34 {
35 return params_;
36 }

◆ IsNotification()

auto jsonrpc::endpoint::Request::IsNotification ( ) const -> bool
inlinenodiscard

Definition at line 38 of file request.hpp.

38 {
39 return is_notification_;
40 }

◆ RequiresResponse()

auto jsonrpc::endpoint::Request::RequiresResponse ( ) const -> bool
nodiscard

Definition at line 86 of file request.cpp.

86 {
87 return !is_notification_;
88}

◆ ToJson()

auto jsonrpc::endpoint::Request::ToJson ( ) const -> nlohmann::json
nodiscard

Definition at line 94 of file request.cpp.

94 {
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}

References jsonrpc::endpoint::kJsonRpcVersion.

Referenced by jsonrpc::endpoint::RpcEndpoint::SendMethodCall(), and jsonrpc::endpoint::RpcEndpoint::SendNotification().

Here is the caller graph for this function:

The documentation for this class was generated from the following files: