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