use super::JupiterClient;
use crate::{
error::{JupiterClientError, handle_response},
types::{NewTokens, TokenInfoResponse, TokenPriceRequest, TokenPriceResponse},
};
impl JupiterClient {
pub async fn get_token_price(
&self,
params: &TokenPriceRequest,
) -> Result<TokenPriceResponse, JupiterClientError> {
let response = match self
.client
.get(format!("{}/price/v2", self.base_url))
.query(¶ms)
.send()
.await
{
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<TokenPriceResponse>().await {
Ok(token_price) => Ok(token_price),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_token_info(
&self,
mint_address: &str,
) -> Result<TokenInfoResponse, JupiterClientError> {
let url = format!("{}/tokens/v1/token/{}", self.base_url, mint_address);
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<TokenInfoResponse>().await {
Ok(token_info) => Ok(token_info),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_market_mints(
&self,
market_address: &str,
) -> Result<Vec<String>, JupiterClientError> {
let url = format!(
"{}/tokens/v1/market/{}/mints",
self.base_url, market_address
);
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<Vec<String>>().await {
Ok(mints) => Ok(mints),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_tradable_mints(&self) -> Result<Vec<String>, JupiterClientError> {
let url = format!("{}/tokens/v1/mints/tradable", self.base_url);
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<Vec<String>>().await {
Ok(mints) => Ok(mints),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_mints_by_tags(
&self,
tags: &[String],
) -> Result<Vec<TokenInfoResponse>, JupiterClientError> {
let url = format!("{}/tokens/v1/tagged/{}", self.base_url, tags.join(","));
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<Vec<TokenInfoResponse>>().await {
Ok(mints) => Ok(mints),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_new_tokens(
&self,
limit: Option<u64>,
offset: Option<u64>,
) -> Result<Vec<NewTokens>, JupiterClientError> {
let mut url = format!("{}/tokens/v1/new", self.base_url);
if let Some(l) = limit {
url.push_str(&format!("?limit={}", l));
}
if let Some(o) = offset {
if url.contains('?') {
url.push_str(&format!("&offset={}", o));
} else {
url.push_str(&format!("?offset={}", o));
}
}
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<Vec<NewTokens>>().await {
Ok(tokens) => Ok(tokens),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
pub async fn get_all_tokens(&self) -> Result<Vec<TokenInfoResponse>, JupiterClientError> {
let url = format!("{}/tokens/v1/all", self.base_url);
let response = match self.client.get(&url).send().await {
Ok(resp) => resp,
Err(e) => return Err(JupiterClientError::RequestError(e)),
};
let response = handle_response(response).await?;
match response.json::<Vec<TokenInfoResponse>>().await {
Ok(tokens) => Ok(tokens),
Err(e) => Err(JupiterClientError::DeserializationError(e.to_string())),
}
}
}