1use crate::account::Account;
2use crate::client::Client;
3use crate::config::Config;
4use crate::futures::account::FuturesAccount;
5use crate::futures::general::FuturesGeneral;
6use crate::futures::market::FuturesMarket;
7use crate::futures::userstream::FuturesUserStream;
8use crate::general::General;
9use crate::market::Market;
10use crate::userstream::UserStream;
11use crate::savings::Savings;
12
13#[allow(clippy::all)]
14pub enum API {
15 Spot(Spot),
16 Savings(Sapi),
17 Futures(Futures),
18}
19
20pub enum Spot {
24 Ping,
25 Time,
26 ExchangeInfo,
27 Depth,
28 Trades,
29 HistoricalTrades,
30 AggTrades,
31 Klines,
32 AvgPrice,
33 Ticker24hr,
34 Price,
35 BookTicker,
36 Order,
37 OrderTest,
38 OpenOrders,
39 AllOrders,
40 Oco,
41 OrderList,
42 AllOrderList,
43 OpenOrderList,
44 Account,
45 MyTrades,
46 UserDataStream,
47}
48
49pub enum Sapi {
50 AllCoins,
51 AssetDetail,
52 DepositAddress,
53 SpotFuturesTransfer,
54 SimpleEarnFlexible,
55 SimpleEarnLocked,
56}
57
58pub enum Futures {
59 Ping,
60 Time,
61 ExchangeInfo,
62 Depth,
63 Trades,
64 HistoricalTrades,
65 AggTrades,
66 Klines,
67 ContinuousKlines,
68 IndexPriceKlines,
69 MarkPriceKlines,
70 PremiumIndex,
71 FundingRate,
72 Ticker24hr,
73 TickerPrice,
74 BookTicker,
75 AllForceOrders,
76 AllOpenOrders,
77 AllOrders,
78 UserTrades,
79 Order,
80 PositionRisk,
81 Balance,
82 PositionSide,
83 OpenInterest,
84 OpenInterestHist,
85 TopLongShortAccountRatio,
86 TopLongShortPositionRatio,
87 GlobalLongShortAccountRatio,
88 TakerlongshortRatio,
89 LvtKlines,
90 IndexInfo,
91 ChangeInitialLeverage,
92 MarginType,
93 PositionMargin,
94 Account,
95 OpenOrders,
96 UserDataStream,
97 Income,
98}
99
100impl From<API> for String {
101 fn from(item: API) -> Self {
102 String::from(match item {
103 API::Spot(route) => match route {
104 Spot::Ping => "/api/v3/ping",
105 Spot::Time => "/api/v3/time",
106 Spot::ExchangeInfo => "/api/v3/exchangeInfo",
107 Spot::Depth => "/api/v3/depth",
108 Spot::Trades => "/api/v3/trades",
109 Spot::HistoricalTrades => "/api/v3/historicalTrades",
110 Spot::AggTrades => "/api/v3/aggTrades",
111 Spot::Klines => "/api/v3/klines",
112 Spot::AvgPrice => "/api/v3/avgPrice",
113 Spot::Ticker24hr => "/api/v3/ticker/24hr",
114 Spot::Price => "/api/v3/ticker/price",
115 Spot::BookTicker => "/api/v3/ticker/bookTicker",
116 Spot::Order => "/api/v3/order",
117 Spot::OrderTest => "/api/v3/order/test",
118 Spot::OpenOrders => "/api/v3/openOrders",
119 Spot::AllOrders => "/api/v3/allOrders",
120 Spot::Oco => "/api/v3/order/oco",
121 Spot::OrderList => "/api/v3/orderList",
122 Spot::AllOrderList => "/api/v3/allOrderList",
123 Spot::OpenOrderList => "/api/v3/openOrderList",
124 Spot::Account => "/api/v3/account",
125 Spot::MyTrades => "/api/v3/myTrades",
126 Spot::UserDataStream => "/api/v3/userDataStream",
127 },
128 API::Savings(route) => match route {
129 Sapi::AllCoins => "/sapi/v1/capital/config/getall",
130 Sapi::AssetDetail => "/sapi/v1/asset/assetDetail",
131 Sapi::DepositAddress => "/sapi/v1/capital/deposit/address",
132 Sapi::SpotFuturesTransfer => "/sapi/v1/futures/transfer",
133 Sapi::SimpleEarnFlexible => "/sapi/v1/simple-earn/flexible/position",
134 Sapi::SimpleEarnLocked => "/sapi/v1/simple-earn/locked/position",
135 },
136 API::Futures(route) => match route {
137 Futures::Ping => "/fapi/v1/ping",
138 Futures::Time => "/fapi/v1/time",
139 Futures::ExchangeInfo => "/fapi/v1/exchangeInfo",
140 Futures::Depth => "/fapi/v1/depth",
141 Futures::Trades => "/fapi/v1/trades",
142 Futures::HistoricalTrades => "/fapi/v1/historicalTrades",
143 Futures::AggTrades => "/fapi/v1/aggTrades",
144 Futures::Klines => "/fapi/v1/klines",
145 Futures::ContinuousKlines => "/fapi/v1/continuousKlines",
146 Futures::IndexPriceKlines => "/fapi/v1/indexPriceKlines",
147 Futures::MarkPriceKlines => "/fapi/v1/markPriceKlines",
148 Futures::PremiumIndex => "/fapi/v1/premiumIndex",
149 Futures::FundingRate => "/fapi/v1/fundingRate",
150 Futures::Ticker24hr => "/fapi/v1/ticker/24hr",
151 Futures::TickerPrice => "/fapi/v1/ticker/price",
152 Futures::BookTicker => "/fapi/v1/ticker/bookTicker",
153 Futures::AllForceOrders => "/fapi/v1/allForceOrders",
154 Futures::AllOpenOrders => "/fapi/v1/allOpenOrders",
155 Futures::AllOrders => "/fapi/v1/allOrders",
156 Futures::UserTrades => "/fapi/v1/userTrades",
157 Futures::PositionSide => "/fapi/v1/positionSide/dual",
158 Futures::Order => "/fapi/v1/order",
159 Futures::PositionRisk => "/fapi/v2/positionRisk",
160 Futures::Balance => "/fapi/v2/balance",
161 Futures::OpenInterest => "/fapi/v1/openInterest",
162 Futures::OpenInterestHist => "/futures/data/openInterestHist",
163 Futures::TopLongShortAccountRatio => "/futures/data/topLongShortAccountRatio",
164 Futures::TopLongShortPositionRatio => "/futures/data/topLongShortPositionRatio",
165 Futures::GlobalLongShortAccountRatio => "/futures/data/globalLongShortAccountRatio",
166 Futures::TakerlongshortRatio => "/futures/data/takerlongshortRatio",
167 Futures::LvtKlines => "/fapi/v1/lvtKlines",
168 Futures::IndexInfo => "/fapi/v1/indexInfo",
169 Futures::ChangeInitialLeverage => "/fapi/v1/leverage",
170 Futures::MarginType => "/fapi/v1/marginType",
171 Futures::PositionMargin => "/fapi/v1/positionMargin",
172 Futures::Account => "/fapi/v2/account",
173 Futures::OpenOrders => "/fapi/v1/openOrders",
174 Futures::UserDataStream => "/fapi/v1/listenKey",
175 Futures::Income => "/fapi/v1/income",
176 },
177 })
178 }
179}
180
181pub trait Binance {
182 fn new(api_key: Option<String>, secret_key: Option<String>) -> Self;
183 fn new_with_config(
184 api_key: Option<String>, secret_key: Option<String>, config: &Config,
185 ) -> Self;
186}
187
188impl Binance for General {
189 fn new(api_key: Option<String>, secret_key: Option<String>) -> General {
190 Self::new_with_config(api_key, secret_key, &Config::default())
191 }
192
193 fn new_with_config(
194 api_key: Option<String>, secret_key: Option<String>, config: &Config,
195 ) -> General {
196 General {
197 client: Client::new(api_key, secret_key, config.rest_api_endpoint.clone()),
198 }
199 }
200}
201
202impl Binance for Account {
203 fn new(api_key: Option<String>, secret_key: Option<String>) -> Account {
204 Self::new_with_config(api_key, secret_key, &Config::default())
205 }
206
207 fn new_with_config(
208 api_key: Option<String>, secret_key: Option<String>, config: &Config,
209 ) -> Account {
210 Account {
211 client: Client::new(api_key, secret_key, config.rest_api_endpoint.clone()),
212 recv_window: config.recv_window,
213 }
214 }
215}
216
217impl Binance for Savings {
218 fn new(api_key: Option<String>, secret_key: Option<String>) -> Self {
219 Self::new_with_config(api_key, secret_key, &Config::default())
220 }
221
222 fn new_with_config(
223 api_key: Option<String>, secret_key: Option<String>, config: &Config,
224 ) -> Self {
225 Self {
226 client: Client::new(api_key, secret_key, config.rest_api_endpoint.clone()),
227 recv_window: config.recv_window,
228 }
229 }
230}
231
232impl Binance for Market {
233 fn new(api_key: Option<String>, secret_key: Option<String>) -> Market {
234 Self::new_with_config(api_key, secret_key, &Config::default())
235 }
236
237 fn new_with_config(
238 api_key: Option<String>, secret_key: Option<String>, config: &Config,
239 ) -> Market {
240 Market {
241 client: Client::new(api_key, secret_key, config.rest_api_endpoint.clone()),
242 recv_window: config.recv_window,
243 }
244 }
245}
246
247impl Binance for UserStream {
248 fn new(api_key: Option<String>, secret_key: Option<String>) -> UserStream {
249 Self::new_with_config(api_key, secret_key, &Config::default())
250 }
251
252 fn new_with_config(
253 api_key: Option<String>, secret_key: Option<String>, config: &Config,
254 ) -> UserStream {
255 UserStream {
256 client: Client::new(api_key, secret_key, config.rest_api_endpoint.clone()),
257 recv_window: config.recv_window,
258 }
259 }
260}
261
262impl Binance for FuturesGeneral {
267 fn new(api_key: Option<String>, secret_key: Option<String>) -> FuturesGeneral {
268 Self::new_with_config(api_key, secret_key, &Config::default())
269 }
270
271 fn new_with_config(
272 api_key: Option<String>, secret_key: Option<String>, config: &Config,
273 ) -> FuturesGeneral {
274 FuturesGeneral {
275 client: Client::new(
276 api_key,
277 secret_key,
278 config.futures_rest_api_endpoint.clone(),
279 ),
280 }
281 }
282}
283
284impl Binance for FuturesMarket {
285 fn new(api_key: Option<String>, secret_key: Option<String>) -> FuturesMarket {
286 Self::new_with_config(api_key, secret_key, &Config::default())
287 }
288
289 fn new_with_config(
290 api_key: Option<String>, secret_key: Option<String>, config: &Config,
291 ) -> FuturesMarket {
292 FuturesMarket {
293 client: Client::new(
294 api_key,
295 secret_key,
296 config.futures_rest_api_endpoint.clone(),
297 ),
298 recv_window: config.recv_window,
299 }
300 }
301}
302
303impl Binance for FuturesAccount {
304 fn new(api_key: Option<String>, secret_key: Option<String>) -> Self {
305 Self::new_with_config(api_key, secret_key, &Config::default())
306 }
307
308 fn new_with_config(
309 api_key: Option<String>, secret_key: Option<String>, config: &Config,
310 ) -> Self {
311 Self {
312 client: Client::new(
313 api_key,
314 secret_key,
315 config.futures_rest_api_endpoint.clone(),
316 ),
317 recv_window: config.recv_window,
318 }
319 }
320}
321
322impl Binance for FuturesUserStream {
323 fn new(api_key: Option<String>, secret_key: Option<String>) -> FuturesUserStream {
324 Self::new_with_config(api_key, secret_key, &Config::default())
325 }
326
327 fn new_with_config(
328 api_key: Option<String>, secret_key: Option<String>, config: &Config,
329 ) -> FuturesUserStream {
330 FuturesUserStream {
331 client: Client::new(
332 api_key,
333 secret_key,
334 config.futures_rest_api_endpoint.clone(),
335 ),
336 recv_window: config.recv_window,
337 }
338 }
339}