use polyoxide_core::{HttpClient, QueryBuilder, Request};
use crate::{
error::DataApiError,
types::{Trade, TradeFilterType, TradeSide},
};
#[derive(Clone)]
pub struct Trades {
pub(crate) http_client: HttpClient,
}
impl Trades {
pub fn list(&self) -> ListTrades {
ListTrades {
request: Request::new(self.http_client.clone(), "/trades"),
}
}
}
pub struct ListTrades {
request: Request<Vec<Trade>, DataApiError>,
}
impl ListTrades {
pub fn user(mut self, user: impl Into<String>) -> Self {
self.request = self.request.query("user", user.into());
self
}
pub fn market(mut self, condition_ids: impl IntoIterator<Item = impl ToString>) -> Self {
let ids: Vec<String> = condition_ids.into_iter().map(|s| s.to_string()).collect();
if !ids.is_empty() {
self.request = self.request.query("market", ids.join(","));
}
self
}
pub fn event_id(mut self, event_ids: impl IntoIterator<Item = impl ToString>) -> Self {
let ids: Vec<String> = event_ids.into_iter().map(|s| s.to_string()).collect();
if !ids.is_empty() {
self.request = self.request.query("eventId", ids.join(","));
}
self
}
pub fn side(mut self, side: TradeSide) -> Self {
self.request = self.request.query("side", side);
self
}
pub fn taker_only(mut self, taker_only: bool) -> Self {
self.request = self.request.query("takerOnly", taker_only);
self
}
pub fn filter_type(mut self, filter_type: TradeFilterType) -> Self {
self.request = self.request.query("filterType", filter_type);
self
}
pub fn filter_amount(mut self, amount: f64) -> Self {
self.request = self.request.query("filterAmount", amount);
self
}
pub fn limit(mut self, limit: u32) -> Self {
self.request = self.request.query("limit", limit);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.request = self.request.query("offset", offset);
self
}
pub async fn send(self) -> Result<Vec<Trade>, DataApiError> {
self.request.send().await
}
}