polyte_data/api/
trades.rs

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