use serde::{Deserialize, Serialize};
use tracing::{instrument, trace};
use super::{Client, validate_event_id, validate_market_id};
use crate::error::Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarketOpenInterest {
pub market: String,
pub value: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarketLiveVolume {
pub market: String,
pub value: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventLiveVolume {
pub total: f64,
pub markets: Option<Vec<MarketLiveVolume>>,
}
impl Client {
#[instrument(skip(self, markets), level = "trace")]
pub async fn get_open_interest(&self, markets: &[&str]) -> Result<Vec<MarketOpenInterest>> {
for market_id in markets {
validate_market_id(market_id)?;
}
let mut url = self.build_url("oi");
if !markets.is_empty() {
let market_value = markets.join(",");
url.query_pairs_mut().append_pair("market", &market_value);
}
trace!(url = %url, method = "GET", market_count = markets.len(), "sending HTTP request");
let response = self.http_client.get(url).send().await?;
let response = self.check_response(response).await?;
let open_interest_response: Vec<MarketOpenInterest> = response.json().await?;
trace!(
count = open_interest_response.len(),
"received open interest data"
);
Ok(open_interest_response)
}
#[instrument(skip(self), fields(event_id = %event_id), level = "trace")]
pub async fn get_event_live_volume(&self, event_id: i64) -> Result<EventLiveVolume> {
validate_event_id(event_id)?;
let mut url = self.build_url("live-volume");
url.query_pairs_mut()
.append_pair("id", &event_id.to_string());
trace!(url = %url, method = "GET", "sending HTTP request");
let response = self.http_client.get(url).send().await?;
let response = self.check_response(response).await?;
let volume_responses: Vec<EventLiveVolume> = response.json().await?;
let result = volume_responses.into_iter().next().ok_or_else(|| {
crate::error::PolymarketError::api("empty live volume response".to_string())
})?;
trace!(total = result.total, "received live volume");
Ok(result)
}
}