rust_okx/api/convert/api.rs
1use crate::client::OkxClient;
2use crate::error::Error;
3use crate::transport::Transport;
4
5use super::requests::{
6 ConvertCurrenciesRequest, ConvertCurrencyPairRequest, ConvertHistoryRequest,
7 ConvertQuoteRequest, ConvertTradeRequest,
8};
9use super::responses::{
10 ConvertCurrency, ConvertCurrencyPair, ConvertHistory, ConvertQuote, ConvertTradeResult,
11};
12
13const CURRENCIES: &str = "/api/v5/asset/convert/currencies";
14const CURRENCY_PAIR: &str = "/api/v5/asset/convert/currency-pair";
15const ESTIMATE_QUOTE: &str = "/api/v5/asset/convert/estimate-quote";
16const TRADE: &str = "/api/v5/asset/convert/trade";
17const HISTORY: &str = "/api/v5/asset/convert/history";
18
19/// Accessor for OKX Convert endpoints.
20///
21/// Obtain one via [`OkxClient::convert`](crate::OkxClient::convert). All
22/// methods require credentials.
23pub struct Convert<'a, T> {
24 client: &'a OkxClient<T>,
25}
26
27impl<'a, T: Transport> Convert<'a, T> {
28 pub(crate) fn new(client: &'a OkxClient<T>) -> Self {
29 Self { client }
30 }
31
32 /// Retrieve currencies supported by Convert.
33 ///
34 /// `GET /api/v5/asset/convert/currencies`. Authenticated.
35 ///
36 /// # Errors
37 ///
38 /// Returns [`Error::Configuration`] without credentials, [`Error::Api`] on a
39 /// non-zero OKX code, or transport/decode errors.
40 pub async fn get_currencies(&self) -> Result<Vec<ConvertCurrency>, Error> {
41 let request = ConvertCurrenciesRequest::new();
42
43 self.client.get(CURRENCIES, &request, true).await
44 }
45
46 /// Retrieve limits and metadata for a Convert currency pair.
47 ///
48 /// `GET /api/v5/asset/convert/currency-pair`. Authenticated.
49 ///
50 /// # Errors
51 ///
52 /// Returns [`Error::InvalidRequest`] when a required request field is empty.
53 /// See [`get_currencies`](Self::get_currencies) for transport and API errors.
54 pub async fn get_currency_pair(
55 &self,
56 request: &ConvertCurrencyPairRequest,
57 ) -> Result<Vec<ConvertCurrencyPair>, Error> {
58 self.client.get(CURRENCY_PAIR, request, true).await
59 }
60
61 /// Estimate a Convert quote.
62 ///
63 /// `POST /api/v5/asset/convert/estimate-quote`. Authenticated.
64 ///
65 /// # Errors
66 ///
67 /// Returns [`Error::InvalidRequest`] when required fields are empty or a
68 /// client request ID is invalid. See [`get_currencies`](Self::get_currencies)
69 /// for transport and API errors.
70 pub async fn estimate_quote(
71 &self,
72 request: &ConvertQuoteRequest,
73 ) -> Result<Vec<ConvertQuote>, Error> {
74 self.client.post(ESTIMATE_QUOTE, request, true).await
75 }
76
77 /// Execute a Convert trade.
78 ///
79 /// `POST /api/v5/asset/convert/trade`. Authenticated.
80 ///
81 /// # Errors
82 ///
83 /// Returns [`Error::InvalidRequest`] when required fields are empty or a
84 /// client request ID is invalid. See [`get_currencies`](Self::get_currencies)
85 /// for transport and API errors.
86 pub async fn convert_trade(
87 &self,
88 request: &ConvertTradeRequest,
89 ) -> Result<Vec<ConvertTradeResult>, Error> {
90 self.client.post(TRADE, request, true).await
91 }
92
93 /// Retrieve Convert trade history.
94 ///
95 /// `GET /api/v5/asset/convert/history`. Authenticated.
96 ///
97 /// # Errors
98 ///
99 /// Returns [`Error::InvalidRequest`] when the limit or client request ID is
100 /// invalid. See [`get_currencies`](Self::get_currencies) for transport and
101 /// API errors.
102 pub async fn get_convert_history(
103 &self,
104 request: &ConvertHistoryRequest,
105 ) -> Result<Vec<ConvertHistory>, Error> {
106 self.client.get(HISTORY, request, true).await
107 }
108}