4 #include "lrdb/optional.hpp"
8 using namespace ::picojson;
16 json::value params = json::value())
18 method(std::move(method)),
19 params(std::move(params)) {}
21 json::value params = json::value())
22 : id(
double(
id)), method(std::move(method)), params(std::move(params)) {}
34 : code(code), message(std::move(message)) {}
38 InvalidRequest = -32600,
39 MethodNotFound = -32601,
40 InvalidParams = -32602,
41 InternalError = -32603,
42 serverErrorStart = -32099,
43 serverErrorEnd = -32000,
45 UnknownErrorCode = -32001
52 : id(std::move(
id)), result(std::move(result)) {}
54 : id(
double(
id)), result(std::move(result)) {}
60 notify_message(std::string method, json::value params = json::value())
61 : method(std::move(method)), params(std::move(params)) {}
66 inline bool is_notify(
const json::value& msg) {
67 return msg.is<json::object>() && !msg.contains(
"id");
69 inline bool is_request(
const json::value& msg) {
70 return msg.is<json::object>() && msg.contains(
"method") &&
71 msg.get(
"method").is<std::string>();
73 inline bool is_response(
const json::value& msg) {
74 return msg.is<json::object>() && !msg.contains(
"method") &&
78 inline bool parse(
const json::value& message, request_message& request) {
79 if (!is_request(message)) {
82 request.id = message.get(
"id");
83 request.method = message.get(
"method").get<std::string>();
84 if (message.contains(
"param")) {
85 request.params = message.get(
"param");
87 request.params = message.get(
"params");
92 inline bool parse(
const json::value& message, notify_message& notify) {
93 if (!is_notify(message)) {
96 notify.method = message.get(
"method").get<std::string>();
97 if (message.contains(
"param")) {
98 notify.params = message.get(
"param");
100 notify.params = message.get(
"params");
105 inline bool parse(
const json::value& message, response_message& response) {
106 if (!is_response(message)) {
109 response.id = message.get(
"id");
110 response.result = message.get(
"result");
114 inline std::string serialize(
const request_message& msg) {
116 obj[
"jsonrpc"] = json::value(
"2.0");
118 obj[
"method"] = json::value(msg.method);
119 if (!msg.params.is<json::null>()) {
120 obj[
"params"] = msg.params;
123 return json::value(obj).serialize();
126 inline std::string serialize(
const response_message& msg) {
128 obj[
"jsonrpc"] = json::value(
"2.0");
130 obj[
"result"] = msg.result;
133 json::object error = {{
"code", json::value(
double(msg.error->code))},
134 {
"message", json::value(msg.error->message)},
135 {
"data", json::value(msg.error->data)}};
136 obj[
"error"] = json::value(error);
140 return json::value(obj).serialize();
143 inline std::string serialize(
const notify_message& msg) {
145 obj[
"jsonrpc"] = json::value(
"2.0");
147 obj[
"method"] = json::value(msg.method);
148 if (!msg.params.is<json::null>()) {
149 obj[
"params"] = msg.params;
151 return json::value(obj).serialize();
154 inline const std::string& get_method(
const json::value& msg) {
155 static std::string
null;
156 if (!msg.is<json::object>() || !msg.contains(
"method")) {
159 const json::value& m = msg.get<json::object>().at(
"method");
160 if (!m.is<std::string>()) {
163 return m.get<std::string>();
165 inline const json::value& get_param(
const json::value& msg) {
166 static json::value
null;
167 if (!msg.is<json::object>() || !msg.contains(
"params")) {
170 return msg.get<json::object>().at(
"params");
172 inline const json::value& get_id(
const json::value& msg) {
173 static json::value
null;
174 if (!msg.is<json::object>() || !msg.contains(
"id")) {
177 return msg.get<json::object>().at(
"id");
180 inline std::string serialize(
const json::value&
id,
const std::string& medhod,
181 const json::value& param = json::value()) {
183 obj[
"method"] = json::value(medhod);
184 if (!param.is<json::null>()) {
185 obj[
"params"] = param;
188 return json::value(obj).serialize();
190 inline std::string serialize(
const json::value&
id,
const std::string& medhod,
191 const std::string& param) {
192 return serialize(
id, medhod, json::value(param));
194 inline std::string serialize(
double id,
const std::string& medhod,
195 const std::string& param) {
196 return serialize(json::value(
id), medhod, json::value(param));
198 inline std::string serialize(
double id,
const std::string& medhod,
199 const json::value& param = json::value()) {
200 return serialize(json::value(
id), medhod, json::value(param));
202 inline std::string serialize(
const std::string&
id,
const std::string& medhod,
203 const std::string& param) {
204 return serialize(json::value(
id), medhod, json::value(param));
206 inline std::string serialize(
const std::string&
id,
const std::string& medhod,
207 const json::value& param = json::value()) {
208 return serialize(json::value(
id), medhod, json::value(param));
212 inline std::string serialize(
const std::string& medhod,
213 const json::value& param = json::value()) {
215 obj[
"method"] = json::value(medhod);
216 if (!param.is<json::null>()) {
217 obj[
"params"] = param;
219 return json::value(obj).serialize();
221 inline std::string serialize(
const std::string& medhod,
222 const std::string& param) {
223 return serialize(medhod, json::value(param));
227 inline std::string serialize(
const json::value&
id,
228 const json::value& result = json::value(),
229 bool error =
false) {
232 obj[
"error"] = result;
234 obj[
"result"] = result;
237 return json::value(obj).serialize();
239 inline std::string serialize(
const json::value&
id,
const std::string& result,
240 bool error =
false) {
241 return serialize(
id, json::value(result), error);
245 using message::request_message;
246 using message::response_message;
247 using message::notify_message;
248 using message::response_error;
self implement for std::optional(C++17 feature).
Definition: optional.hpp:19
Definition: message.hpp:59
Definition: message.hpp:13
Definition: message.hpp:28
Definition: message.hpp:49