Kagome
Polkadot Runtime Engine in C++17
custom_json_writer.hpp
Go to the documentation of this file.
1 
6 #ifndef KAGOME_CUSTOM_JSON_WRITER_HPP
7 #define KAGOME_CUSTOM_JSON_WRITER_HPP
8 
9 #include <jsonrpc-lean/json.h>
10 #include <jsonrpc-lean/jsonformatteddata.h>
11 #include <jsonrpc-lean/util.h>
12 #include <jsonrpc-lean/value.h>
13 #include <jsonrpc-lean/writer.h>
14 
15 #define RAPIDJSON_NO_SIZETYPEDEFINE
16 namespace rapidjson {
17  typedef ::std::size_t SizeType;
18 }
19 
20 #include <rapidjson/stringbuffer.h>
21 #include <rapidjson/writer.h>
22 
23 namespace kagome::api {
24 
28  class JsonWriter final : public jsonrpc::Writer {
29  public:
30  JsonWriter() : myRequestData(new jsonrpc::JsonFormattedData()) {}
31 
32  // Writer
33  std::shared_ptr<jsonrpc::FormattedData> GetData() override {
34  return std::static_pointer_cast<jsonrpc::FormattedData>(myRequestData);
35  }
36 
37  void StartDocument() override {
38  // Empty
39  }
40 
41  void EndDocument() override {
42  // Empty
43  }
44 
45  void StartRequest(const std::string &methodName,
46  const jsonrpc::Value &id) override {
47  myRequestData->Writer.StartObject();
48 
49  myRequestData->Writer.Key(jsonrpc::json::JSONRPC_NAME,
50  sizeof(jsonrpc::json::JSONRPC_NAME) - 1);
51  myRequestData->Writer.String(
52  jsonrpc::json::JSONRPC_VERSION_2_0,
53  sizeof(jsonrpc::json::JSONRPC_VERSION_2_0) - 1);
54 
55  myRequestData->Writer.Key(jsonrpc::json::METHOD_NAME,
56  sizeof(jsonrpc::json::METHOD_NAME) - 1);
57  myRequestData->Writer.String(methodName.data(), methodName.size(), true);
58 
59  WriteId(id);
60 
61  myRequestData->Writer.Key(jsonrpc::json::PARAMS_NAME,
62  sizeof(jsonrpc::json::PARAMS_NAME) - 1);
63  }
64 
65  void EndRequest() override {
66  myRequestData->Writer.EndObject();
67  }
68 
69  void StartParameter() override {
70  // Empty
71  }
72 
73  void EndParameter() override {
74  // Empty
75  }
76 
77  void StartResponse(const jsonrpc::Value &id) override {
78  myRequestData->Writer.StartObject();
79 
80  myRequestData->Writer.Key(jsonrpc::json::JSONRPC_NAME,
81  sizeof(jsonrpc::json::JSONRPC_NAME) - 1);
82  myRequestData->Writer.String(
83  jsonrpc::json::JSONRPC_VERSION_2_0,
84  sizeof(jsonrpc::json::JSONRPC_VERSION_2_0) - 1);
85 
86  WriteId(id);
87 
88  myRequestData->Writer.Key(jsonrpc::json::RESULT_NAME,
89  sizeof(jsonrpc::json::RESULT_NAME) - 1);
90  }
91 
92  void EndResponse() override {
93  myRequestData->Writer.EndObject();
94  }
95 
96  void StartFaultResponse(const jsonrpc::Value &id) override {
97  myRequestData->Writer.StartObject();
98 
99  myRequestData->Writer.Key(jsonrpc::json::JSONRPC_NAME,
100  sizeof(jsonrpc::json::JSONRPC_NAME) - 1);
101  myRequestData->Writer.String(
102  jsonrpc::json::JSONRPC_VERSION_2_0,
103  sizeof(jsonrpc::json::JSONRPC_VERSION_2_0) - 1);
104 
105  WriteId(id);
106  }
107 
108  void EndFaultResponse() override {
109  myRequestData->Writer.EndObject();
110  }
111 
112  void WriteFault(int32_t code, const std::string &string) override {
113  myRequestData->Writer.Key(jsonrpc::json::ERROR_NAME,
114  sizeof(jsonrpc::json::ERROR_NAME) - 1);
115  myRequestData->Writer.StartObject();
116 
117  myRequestData->Writer.Key(jsonrpc::json::ERROR_CODE_NAME,
118  sizeof(jsonrpc::json::ERROR_CODE_NAME) - 1);
119  myRequestData->Writer.Int(code);
120 
121  myRequestData->Writer.Key(jsonrpc::json::ERROR_MESSAGE_NAME,
122  sizeof(jsonrpc::json::ERROR_MESSAGE_NAME) - 1);
123  myRequestData->Writer.String(string.data(), string.size(), true);
124 
125  myRequestData->Writer.EndObject();
126  }
127 
128  void StartArray() override {
129  myRequestData->Writer.StartArray();
130  }
131 
132  void EndArray() override {
133  myRequestData->Writer.EndArray();
134  }
135 
136  void StartStruct() override {
137  myRequestData->Writer.StartObject();
138  }
139 
140  void EndStruct() override {
141  myRequestData->Writer.EndObject();
142  }
143 
144  void StartStructElement(const std::string &name) override {
145  myRequestData->Writer.Key(name.data(), name.size(), true);
146  }
147 
148  void EndStructElement() override {
149  // Empty
150  }
151 
152  void WriteBinary(const char *data, size_t size) override {
153  myRequestData->Writer.String(data, size, true);
154  }
155 
156  void WriteNull() override {
157  myRequestData->Writer.Null();
158  }
159 
160  void Write(bool value) override {
161  myRequestData->Writer.Bool(value);
162  }
163 
164  void Write(double value) override {
165  myRequestData->Writer.Double(value);
166  }
167 
168  void Write(int32_t value) override {
169  myRequestData->Writer.Int(value);
170  }
171 
172  void Write(int64_t value) override {
173  myRequestData->Writer.Int64(value);
174  }
175 
176  void Write(const std::string &value) override {
177  myRequestData->Writer.String(value.data(), value.size(), true);
178  }
179 
180  void Write(const tm &value) override {
181  Write(jsonrpc::util::FormatIso8601DateTime(value));
182  }
183 
184  private:
185  void WriteId(const jsonrpc::Value &id) {
186  if (id.IsString() || id.IsInteger32() || id.IsInteger64() || id.IsNil()) {
187  myRequestData->Writer.Key(jsonrpc::json::ID_NAME,
188  sizeof(jsonrpc::json::ID_NAME) - 1);
189  if (id.IsString()) {
190  myRequestData->Writer.String(
191  id.AsString().data(), id.AsString().size(), true);
192  } else if (id.IsInteger32()) {
193  myRequestData->Writer.Int(id.AsInteger32());
194  } else if (id.IsInteger64()) {
195  myRequestData->Writer.Int64(id.AsInteger64());
196  } else {
197  myRequestData->Writer.Null();
198  }
199  }
200  }
201 
202  std::shared_ptr<jsonrpc::JsonFormattedData> myRequestData;
203  };
204 
205 } // namespace kagome::api
206 
207 #endif // KAGOME_CUSTOM_JSON_WRITER_HPP
void WriteId(const jsonrpc::Value &id)
void Write(const std::string &value) override
void WriteFault(int32_t code, const std::string &string) override
void StartResponse(const jsonrpc::Value &id) override
void StartStructElement(const std::string &name) override
std::shared_ptr< jsonrpc::JsonFormattedData > myRequestData
void Write(double value) override
void Write(int32_t value) override
void StartFaultResponse(const jsonrpc::Value &id) override
void WriteBinary(const char *data, size_t size) override
void Write(bool value) override
void Write(int64_t value) override
void Write(const tm &value) override
::std::size_t SizeType
std::shared_ptr< jsonrpc::FormattedData > GetData() override
void StartRequest(const std::string &methodName, const jsonrpc::Value &id) override