Skip to main content

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}