polyte_data/api/
trades.rs

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