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}