Skip to main content

rust_okx/api/convert/
api.rs

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