Skip to main content

polyoxide_data/api/
trades.rs

1use polyoxide_core::{HttpClient, QueryBuilder, Request};
2
3use crate::{
4    error::DataApiError,
5    types::{Trade, TradeFilterType, TradeSide},
6};
7
8/// Trades namespace for trade-related operations
9#[derive(Clone)]
10pub struct Trades {
11    pub(crate) http_client: HttpClient,
12}
13
14impl Trades {
15    /// List trades with optional filtering
16    pub fn list(&self) -> ListTrades {
17        ListTrades {
18            request: Request::new(self.http_client.clone(), "/trades"),
19        }
20    }
21}
22
23/// Request builder for listing trades
24pub struct ListTrades {
25    request: Request<Vec<Trade>, DataApiError>,
26}
27
28impl ListTrades {
29    /// Filter by user address (0x-prefixed, 40 hex chars)
30    pub fn user(mut self, user: impl Into<String>) -> Self {
31        self.request = self.request.query("user", user.into());
32        self
33    }
34
35    /// Filter by market condition IDs (comma-separated)
36    /// Note: Mutually exclusive with `event_id`
37    pub fn market(mut self, condition_ids: impl IntoIterator<Item = impl ToString>) -> Self {
38        let ids: Vec<String> = condition_ids.into_iter().map(|s| s.to_string()).collect();
39        if !ids.is_empty() {
40            self.request = self.request.query("market", ids.join(","));
41        }
42        self
43    }
44
45    /// Filter by event IDs (comma-separated)
46    /// Note: Mutually exclusive with `market`
47    pub fn event_id(mut self, event_ids: impl IntoIterator<Item = impl ToString>) -> Self {
48        let ids: Vec<String> = event_ids.into_iter().map(|s| s.to_string()).collect();
49        if !ids.is_empty() {
50            self.request = self.request.query("eventId", ids.join(","));
51        }
52        self
53    }
54
55    /// Filter by trade side (BUY or SELL)
56    pub fn side(mut self, side: TradeSide) -> Self {
57        self.request = self.request.query("side", side);
58        self
59    }
60
61    /// Filter for taker trades only (default: true)
62    pub fn taker_only(mut self, taker_only: bool) -> Self {
63        self.request = self.request.query("takerOnly", taker_only);
64        self
65    }
66
67    /// Set filter type (must be paired with `filter_amount`)
68    pub fn filter_type(mut self, filter_type: TradeFilterType) -> Self {
69        self.request = self.request.query("filterType", filter_type);
70        self
71    }
72
73    /// Set filter amount (must be paired with `filter_type`)
74    pub fn filter_amount(mut self, amount: f64) -> Self {
75        self.request = self.request.query("filterAmount", amount);
76        self
77    }
78
79    /// Set maximum number of results (0-10000, default: 100)
80    pub fn limit(mut self, limit: u32) -> Self {
81        self.request = self.request.query("limit", limit);
82        self
83    }
84
85    /// Set pagination offset (0-10000, default: 0)
86    pub fn offset(mut self, offset: u32) -> Self {
87        self.request = self.request.query("offset", offset);
88        self
89    }
90
91    /// Execute the request
92    pub async fn send(self) -> Result<Vec<Trade>, DataApiError> {
93        self.request.send().await
94    }
95}