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") || 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}
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 89 of file request.cpp.

89 {
90 return id_;
91}

◆ 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 85 of file request.cpp.

85 {
86 return !is_notification_;
87}

◆ ToJson()

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

Definition at line 93 of file request.cpp.

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

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: