Skip to main content

binance/
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    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
262// *****************************************************
263//              Binance Futures API
264// *****************************************************
265
266impl 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}