Advertisement
den4ik2003

Untitled

Jan 20th, 2025
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.51 KB | None | 0 0
  1. #ifndef __lbank_spot__api_hpp
  2. #define __lbank_spot__api_hpp
  3.  
  4. #include <parsing/api.hpp>
  5. #include <parsing/core.hpp>
  6. #include <parsing/parsing.hpp>
  7. #include <parsing/markets/lbank_spot/errors.hpp>
  8. #include <stdexcept>
  9. #include <vector>
  10.  
  11. namespace mira {
  12.  
  13. class lbank_spot_api : public basic_api {
  14. protected:
  15.  
  16. template <typename Output, typename Error, typename... Args>
  17. class basic_wrapper {
  18. public:
  19. virtual market_error to_market_error(Error e) = 0;
  20.  
  21. FutureHandle<result_t<Output, market_error>> run(std::string_view&& raw_request) {
  22. std::function<result_t<Output, market_error>(std::string&&)> transformer = [this] (std::string&& response_str) {
  23. field_t response = field_t::deserialize(response_str);
  24. result_t<Output, market_error> market_res;
  25. if (response.count("_LE")) {
  26. market_error err;
  27. std::cout << "LocalError: " + response.serialize() + "\n";
  28. err.code = static_cast<e_market_error>(-response.at("_LE").i());
  29. market_res.set_error(err);
  30. return market_res;
  31. }
  32. result_t<Output, Error> res = process(std::move(response));
  33. if (res) {
  34. market_res.set_value(std::move(res.value()));
  35. } else {
  36. market_res.set_error(to_market_error(res.code()));
  37. }
  38. return market_res;
  39. };
  40. return execute(std::move(raw_request)).transform(std::move(transformer));
  41. }
  42.  
  43. FutureHandle<result_t<Output, market_error>> operator()(Args... args) {
  44. return run(request_filler(std::forward<Args>(args)...));
  45. }
  46.  
  47. virtual result_t<Output, Error> process(field_t&& response) = 0;
  48. virtual FutureHandle<std::string> execute(std::string_view request) = 0;
  49. virtual std::string request_filler(Args... args) = 0;
  50. virtual Output response_filler(field_t&& response) = 0;
  51.  
  52. protected:
  53. lbank_spot_api* api_;
  54. };
  55.  
  56. template <typename Output, typename... Args>
  57. class lbank_spot_wrapper : public basic_wrapper<Output, e_lbank_spot_error, Args...> {
  58. public:
  59. market_error to_market_error(e_lbank_spot_error error) override {
  60. return lbank_spot_to_market(error);
  61. }
  62.  
  63. result_t<Output, e_lbank_spot_error> process(field_t&& response) override {
  64. result_t<Output, e_lbank_spot_error> res;
  65. e_http_error http_error_code = e_http_error_from_str(response.at("code").s());
  66. response = response.at("data");
  67. switch (http_error_code) {
  68. case e_http_error::OK:
  69. res.set_value(std::move(response_filler(std::move(response))));
  70. break;
  71. case e_http_error::BAD_REQUEST:
  72. std::cerr << response.serialize() << '\n';
  73. res.set_error(static_cast<e_lbank_spot_error>(response.at("code").i()));
  74. break;
  75. default:
  76. // throw std::runtime_error("mira::lbank_spot_wrapper::operator(): unknown http error: " + std::to_string(static_cast<int>(http_error_code)));
  77. std::cerr << "mira::lbank_spot_wrapper::operator(): unknown http error: " + std::to_string(static_cast<int>(http_error_code)) << std::endl;
  78. abort();
  79. }
  80. return res;
  81. }
  82.  
  83. virtual FutureHandle<std::string> execute(std::string_view request) override = 0;
  84. virtual std::string request_filler(Args... args) override = 0;
  85. virtual Output response_filler(field_t&& response) override = 0;
  86. };
  87.  
  88. // class new_order_wrapper : public lbank_spot_wrapper<order_t, const order_request_t&> {
  89. // public:
  90. // new_order_wrapper(lbank_spot_api* api) {
  91. // api_ = api;
  92. // }
  93.  
  94. // FutureHandle<std::string> execute(std::string_view request) override;
  95. // std::string request_filler(const order_request_t& order) override;
  96. // order_t response_filler(field_t&& response) override;
  97.  
  98. // } _new_order{this};
  99.  
  100. // class cancel_order_wrapper : public lbank_spot_wrapper<order_t, const ticker_t*, const order_identifier_t&> {
  101. // public:
  102. // cancel_order_wrapper(lbank_spot_api* api) {
  103. // api_ = api;
  104. // }
  105.  
  106. // FutureHandle<std::string> execute(std::string_view request) override;
  107. // std::string request_filler(const ticker_t* symbol, const order_identifier_t& id) override;
  108. // order_t response_filler(field_t&& response) override;
  109.  
  110. // } _cancel_order{this};
  111.  
  112. // class cancel_open_orders_wrapper : public lbank_spot_wrapper<std::vector<order_t>, const ticker_t*> {
  113. // public:
  114. // cancel_open_orders_wrapper(lbank_spot_api* api) {
  115. // api_ = api;
  116. // }
  117.  
  118. // FutureHandle<std::string> execute(std::string_view request) override;
  119. // std::string request_filler(const ticker_t* symbol) override;
  120. // std::vector<order_t> response_filler(field_t&& response) override;
  121.  
  122. // } _cancel_open_orders{this};
  123.  
  124. // class get_open_orders_wrapper : public lbank_spot_wrapper<std::vector<order_t>, const ticker_t*> {
  125. // public:
  126. // get_open_orders_wrapper(lbank_spot_api* api) {
  127. // api_ = api;
  128. // }
  129.  
  130. // FutureHandle<std::string> execute(std::string_view request) override;
  131. // std::string request_filler(const ticker_t* symbol) override;
  132. // std::vector<order_t> response_filler(field_t&& response) override;
  133.  
  134. // } _get_open_orders{this};
  135.  
  136. class get_exchange_info_wrapper : public lbank_spot_wrapper<std::vector<ticker_t>, std::optional<std::string>> {
  137. public:
  138. get_exchange_info_wrapper(lbank_spot_api* api) {
  139. api_ = api;
  140. }
  141.  
  142. FutureHandle<std::string> execute(std::string_view request) override;
  143. std::string request_filler(std::optional<std::string> symbol) override;
  144. std::vector<ticker_t> response_filler(field_t&& response) override;
  145.  
  146. } _get_exchange_info{this};
  147.  
  148. class get_depth_wrapper : public lbank_spot_wrapper<depth_t, const ticker_t*, std::optional<size_t>> {
  149. public:
  150. get_depth_wrapper(lbank_spot_api* api) {
  151. api_ = api;
  152. }
  153.  
  154. FutureHandle<std::string> execute(std::string_view request) override;
  155. std::string request_filler(const ticker_t* symbol, std::optional<size_t> limit) override;
  156. depth_t response_filler(field_t&& response) override;
  157.  
  158. private:
  159. const ticker_t* symbol_;
  160. } _get_depth{this};
  161.  
  162. class get_account_wrapper : public lbank_spot_wrapper<account_t> {
  163. public:
  164. get_account_wrapper(lbank_spot_api* api) {
  165. api_ = api;
  166. }
  167.  
  168. FutureHandle<std::string> execute(std::string_view request) override;
  169. std::string request_filler() override;
  170. account_t response_filler(field_t&& response) override;
  171.  
  172. } _get_account{this};
  173.  
  174. // class new_listen_key_wrapper : public lbank_spot_wrapper<std::string> {
  175. // public:
  176. // new_listen_key_wrapper(lbank_spot_api* api) {
  177. // api_ = api;
  178. // }
  179.  
  180. // FutureHandle<std::string> execute(std::string_view request) override;
  181. // std::string request_filler() override;
  182. // std::string response_filler(field_t&& response) override;
  183.  
  184. // } _new_listen_key{this};
  185.  
  186. // class get_listen_keys_wrapper : public lbank_spot_wrapper<std::vector<std::string>> {
  187. // public:
  188. // get_listen_keys_wrapper(lbank_spot_api* api) {
  189. // api_ = api;
  190. // }
  191.  
  192. // FutureHandle<std::string> execute(std::string_view request) override;
  193. // std::string request_filler() override;
  194. // std::vector<std::string> response_filler(field_t&& response) override;
  195.  
  196. // } _get_listen_keys{this};
  197.  
  198. // class keep_alive_listen_key_wrapper : public lbank_spot_wrapper<std::string, const std::string&> {
  199. // public:
  200. // keep_alive_listen_key_wrapper(lbank_spot_api* api) {
  201. // api_ = api;
  202. // }
  203.  
  204. // FutureHandle<std::string> execute(std::string_view request) override;
  205. // std::string request_filler(const std::string& listen_key) override;
  206. // std::string response_filler(field_t&& response) override;
  207.  
  208. // } _keep_alive_listen_key{this};
  209.  
  210. // class close_listen_key_wrapper : public lbank_spot_wrapper<std::string, const std::string&> {
  211. // public:
  212. // close_listen_key_wrapper(lbank_spot_api* api) {
  213. // api_ = api;
  214. // }
  215.  
  216. // FutureHandle<std::string> execute(std::string_view request) override;
  217. // std::string request_filler(const std::string& listen_key) override;
  218. // std::string response_filler(field_t&& response) override;
  219.  
  220. // } _close_listen_key{this};
  221.  
  222. result_t<std::vector<ws_event>, e_stream_error> _feed_process(const char* feed) override;
  223.  
  224. // ws_trade_event _trade_filler(field_t&& feed);
  225.  
  226. // ws_diff_depth_event _diff_depth_filler(field_t&& feed);
  227.  
  228. // ws_part_depth_event _part_depth_filler(field_t&& feed);
  229.  
  230. // ws_book_event _book_filler(field_t&& feed);
  231.  
  232. // ws_account_balance_event _account_balance_filler(field_t&& feed);
  233.  
  234. // ws_account_trade_event _account_trade_filler(field_t&& feed);
  235.  
  236. // ws_account_order_event _account_order_filler(field_t&& feed);
  237.  
  238. webcore::headers_t gen_headers(char* buf, const field_t& signed_query);
  239.  
  240. field_t form_signed_query(field_t query);
  241.  
  242. void _run_ws() override;
  243.  
  244. std::string listen_key_;
  245. void *ws_client_;
  246. void *ws_mutex_;
  247. webcore core_;
  248. webcore::str_callback* ws_callback_;
  249.  
  250. std::string api_ = "", secret_ = "";
  251.  
  252. // унести в utils
  253. const char* letters_[62] = {
  254. "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  255. "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
  256. "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
  257. "u", "v", "w", "x", "y", "z",
  258. "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
  259. "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
  260. "U", "V", "W", "X", "Y", "Z",
  261. };
  262.  
  263. constexpr static const char* header_names_[4] = {"accept-language", "timestamp", "signature_method", "echostr"};
  264.  
  265. public:
  266. static constexpr std::string_view HOST_URL = "https://www.lbkex.net";
  267.  
  268. // static constexpr std::string_view HOST_URL = "https://api.lbkex.com:443";
  269.  
  270. lbank_spot_api(const account_name_t& name);
  271.  
  272. lbank_spot_api(const account_name_t& name, const std::unordered_map<std::string, std::string>& args);
  273.  
  274. // FutureHandle<result_t<order_t, market_error>> new_order(const order_request_t& order) override;
  275.  
  276. // FutureHandle<result_t<order_t, market_error>> cancel_order(const cancel_request_t& request) override;
  277.  
  278. // FutureHandle<result_t<std::vector<order_t>, market_error>> cancel_open_orders(const ticker_t* symbol, std::optional<e_order_group> order_group) override;
  279.  
  280. // FutureHandle<result_t<std::vector<order_t>, market_error>> get_open_orders(const ticker_t* symbol) override;
  281.  
  282. FutureHandle<result_t<std::vector<ticker_t>, market_error>> get_exchange_info(std::optional<std::string> symbol = {}) override;
  283.  
  284. FutureHandle<result_t<depth_t, market_error>> get_depth(const ticker_t* symbol, std::optional<size_t> limit = {}) override;
  285.  
  286. FutureHandle<result_t<account_t, market_error>> get_account() override;
  287.  
  288. void ws_blocking_call(std::function<void()> call) override {
  289. core_.ws_blocking_call(call, ws_mutex_);
  290. }
  291.  
  292. ~lbank_spot_api() {}
  293.  
  294. };
  295.  
  296. }
  297.  
  298. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement