use crate::client::OkxClient;
use crate::error::Error;
use crate::model::ValidateRequest;
use crate::transport::Transport;
use super::requests::{
ConvertCurrenciesRequest, ConvertCurrencyPairRequest, ConvertHistoryRequest,
ConvertQuoteRequest, ConvertTradeRequest,
};
use super::responses::{
ConvertCurrency, ConvertCurrencyPair, ConvertHistory, ConvertQuote, ConvertTradeResult,
};
const CURRENCIES: &str = "/api/v5/asset/convert/currencies";
const CURRENCY_PAIR: &str = "/api/v5/asset/convert/currency-pair";
const ESTIMATE_QUOTE: &str = "/api/v5/asset/convert/estimate-quote";
const TRADE: &str = "/api/v5/asset/convert/trade";
const HISTORY: &str = "/api/v5/asset/convert/history";
pub struct Convert<'a, T> {
client: &'a OkxClient<T>,
}
impl<'a, T: Transport> Convert<'a, T> {
pub(crate) fn new(client: &'a OkxClient<T>) -> Self {
Self { client }
}
pub async fn get_currencies(&self) -> Result<Vec<ConvertCurrency>, Error> {
let request = ConvertCurrenciesRequest::new();
request.validate()?;
self.client.get(CURRENCIES, &request, true).await
}
pub async fn get_currency_pair(
&self,
request: &ConvertCurrencyPairRequest,
) -> Result<Vec<ConvertCurrencyPair>, Error> {
request.validate()?;
self.client.get(CURRENCY_PAIR, request, true).await
}
pub async fn estimate_quote(
&self,
request: &ConvertQuoteRequest,
) -> Result<Vec<ConvertQuote>, Error> {
request.validate()?;
self.client.post(ESTIMATE_QUOTE, request, true).await
}
pub async fn convert_trade(
&self,
request: &ConvertTradeRequest,
) -> Result<Vec<ConvertTradeResult>, Error> {
request.validate()?;
self.client.post(TRADE, request, true).await
}
pub async fn get_convert_history(
&self,
request: &ConvertHistoryRequest,
) -> Result<Vec<ConvertHistory>, Error> {
request.validate()?;
self.client.get(HISTORY, request, true).await
}
}