use crate::error::{Result, StrikeError};
use crate::indexer::types::*;
pub struct IndexerClient {
base_url: String,
http: reqwest::Client,
}
impl IndexerClient {
pub(crate) fn new(base_url: &str) -> Self {
Self {
base_url: base_url.trim_end_matches('/').to_string(),
http: reqwest::Client::new(),
}
}
pub async fn get_markets(&self) -> Result<Vec<Market>> {
self.get_markets_by_status(None).await
}
pub async fn get_active_markets(&self) -> Result<Vec<Market>> {
self.get_markets_by_status(Some("active")).await
}
pub async fn get_resolved_markets(&self) -> Result<Vec<Market>> {
self.get_markets_by_status(Some("resolved")).await
}
async fn get_markets_by_status(&self, status: Option<&str>) -> Result<Vec<Market>> {
let mut all_markets = Vec::new();
let limit = 500;
let mut offset = 0;
loop {
let mut url = format!(
"{}/markets?limit={}&offset={}",
self.base_url, limit, offset
);
if let Some(s) = status {
url.push_str(&format!("&status={}", s));
}
let resp: MarketsResponse = self
.http
.get(&url)
.send()
.await?
.json()
.await
.map_err(|e| StrikeError::Indexer(e.to_string()))?;
let count = resp.data.len();
all_markets.extend(resp.data);
if count < limit {
break;
}
offset += limit;
}
Ok(all_markets)
}
pub async fn get_orderbook(&self, market_id: u64) -> Result<OrderbookSnapshot> {
let url = format!("{}/orderbook/{}", self.base_url, market_id);
let resp: OrderbookSnapshot = self
.http
.get(&url)
.send()
.await?
.json()
.await
.map_err(|e| StrikeError::Indexer(e.to_string()))?;
Ok(resp)
}
pub async fn get_open_orders(&self, address: &str) -> Result<Vec<IndexerOrder>> {
Ok(self.get_positions(address).await?.open_orders)
}
pub async fn get_positions(&self, address: &str) -> Result<IndexerPositions> {
let url = format!("{}/positions/{}", self.base_url, address);
let resp: PositionsResponse = self
.http
.get(&url)
.send()
.await?
.json()
.await
.map_err(|e| StrikeError::Indexer(e.to_string()))?;
Ok(resp.into_positions())
}
pub async fn get_redeemable_positions(
&self,
address: &str,
) -> Result<Vec<IndexerRedeemablePosition>> {
let url = format!("{}/positions/{}/redeemable", self.base_url, address);
let resp: RedeemablePositionsResponse = self
.http
.get(&url)
.send()
.await?
.json()
.await
.map_err(|e| StrikeError::Indexer(e.to_string()))?;
Ok(resp.into_positions())
}
}