Skip to main content

binance_rs_plus/
api.rs

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
20/// Endpoint for production and test orders.
21///
22/// Orders issued to test are validated, but not sent into the matching engine.
23pub 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
258// *****************************************************
259//              Binance Futures API
260// *****************************************************
261
262impl 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}