polyte_gamma/api/
markets.rs

1use reqwest::Client;
2use url::Url;
3
4use crate::{
5    request::{QueryBuilder, Request},
6    types::Market,
7};
8
9/// Markets namespace for market-related operations
10#[derive(Clone)]
11pub struct Markets {
12    pub(crate) client: Client,
13    pub(crate) base_url: Url,
14}
15
16impl Markets {
17    /// Get a specific market by ID
18    pub fn get(&self, id: impl Into<String>) -> Request<Market> {
19        Request::new(
20            self.client.clone(),
21            self.base_url.clone(),
22            format!("/markets/{}", urlencoding::encode(&id.into())),
23        )
24    }
25
26    /// List markets with optional filtering
27    pub fn list(&self) -> ListMarkets {
28        ListMarkets {
29            request: Request::new(
30                self.client.clone(),
31                self.base_url.clone(),
32                "/markets".to_string(),
33            ),
34        }
35    }
36}
37
38/// Request builder for listing markets
39pub struct ListMarkets {
40    request: Request<Vec<Market>>,
41}
42
43impl ListMarkets {
44    /// Set maximum number of results (minimum: 0)
45    pub fn limit(mut self, limit: u32) -> Self {
46        self.request = self.request.query("limit", limit);
47        self
48    }
49
50    /// Set pagination offset (minimum: 0)
51    pub fn offset(mut self, offset: u32) -> Self {
52        self.request = self.request.query("offset", offset);
53        self
54    }
55
56    /// Set order fields (comma-separated list)
57    pub fn order(mut self, order: impl Into<String>) -> Self {
58        self.request = self.request.query("order", order.into());
59        self
60    }
61
62    /// Set sort direction
63    pub fn ascending(mut self, ascending: bool) -> Self {
64        self.request = self.request.query("ascending", ascending);
65        self
66    }
67
68    /// Filter by specific market IDs
69    pub fn id(mut self, ids: impl IntoIterator<Item = i64>) -> Self {
70        self.request = self.request.query_many("id", ids);
71        self
72    }
73
74    /// Filter by market slugs
75    pub fn slug(mut self, slugs: impl IntoIterator<Item = impl ToString>) -> Self {
76        self.request = self.request.query_many("slug", slugs);
77        self
78    }
79
80    /// Filter by CLOB token IDs
81    pub fn clob_token_ids(mut self, token_ids: impl IntoIterator<Item = impl ToString>) -> Self {
82        self.request = self.request.query_many("clob_token_ids", token_ids);
83        self
84    }
85
86    /// Filter by condition IDs
87    pub fn condition_ids(mut self, condition_ids: impl IntoIterator<Item = impl ToString>) -> Self {
88        self.request = self.request.query_many("condition_ids", condition_ids);
89        self
90    }
91
92    /// Filter by market maker addresses
93    pub fn market_maker_address(
94        mut self,
95        addresses: impl IntoIterator<Item = impl ToString>,
96    ) -> Self {
97        self.request = self.request.query_many("market_maker_address", addresses);
98        self
99    }
100
101    /// Set minimum liquidity threshold
102    pub fn liquidity_num_min(mut self, min: f64) -> Self {
103        self.request = self.request.query("liquidity_num_min", min);
104        self
105    }
106
107    /// Set maximum liquidity threshold
108    pub fn liquidity_num_max(mut self, max: f64) -> Self {
109        self.request = self.request.query("liquidity_num_max", max);
110        self
111    }
112
113    /// Set minimum trading volume
114    pub fn volume_num_min(mut self, min: f64) -> Self {
115        self.request = self.request.query("volume_num_min", min);
116        self
117    }
118
119    /// Set maximum trading volume
120    pub fn volume_num_max(mut self, max: f64) -> Self {
121        self.request = self.request.query("volume_num_max", max);
122        self
123    }
124
125    /// Set earliest market start date (ISO 8601 format)
126    pub fn start_date_min(mut self, date: impl Into<String>) -> Self {
127        self.request = self.request.query("start_date_min", date.into());
128        self
129    }
130
131    /// Set latest market start date (ISO 8601 format)
132    pub fn start_date_max(mut self, date: impl Into<String>) -> Self {
133        self.request = self.request.query("start_date_max", date.into());
134        self
135    }
136
137    /// Set earliest market end date (ISO 8601 format)
138    pub fn end_date_min(mut self, date: impl Into<String>) -> Self {
139        self.request = self.request.query("end_date_min", date.into());
140        self
141    }
142
143    /// Set latest market end date (ISO 8601 format)
144    pub fn end_date_max(mut self, date: impl Into<String>) -> Self {
145        self.request = self.request.query("end_date_max", date.into());
146        self
147    }
148
149    /// Filter by tag identifier
150    pub fn tag_id(mut self, tag_id: i64) -> Self {
151        self.request = self.request.query("tag_id", tag_id);
152        self
153    }
154
155    /// Include related tags in response
156    pub fn related_tags(mut self, include: bool) -> Self {
157        self.request = self.request.query("related_tags", include);
158        self
159    }
160
161    /// Filter for create-your-own markets
162    pub fn cyom(mut self, cyom: bool) -> Self {
163        self.request = self.request.query("cyom", cyom);
164        self
165    }
166
167    /// Filter by UMA resolution status
168    pub fn uma_resolution_status(mut self, status: impl Into<String>) -> Self {
169        self.request = self.request.query("uma_resolution_status", status.into());
170        self
171    }
172
173    /// Filter by game identifier
174    pub fn game_id(mut self, game_id: impl Into<String>) -> Self {
175        self.request = self.request.query("game_id", game_id.into());
176        self
177    }
178
179    /// Filter by sports market types
180    pub fn sports_market_types(mut self, types: impl IntoIterator<Item = impl ToString>) -> Self {
181        self.request = self.request.query_many("sports_market_types", types);
182        self
183    }
184
185    /// Set minimum rewards threshold
186    pub fn rewards_min_size(mut self, min: f64) -> Self {
187        self.request = self.request.query("rewards_min_size", min);
188        self
189    }
190
191    /// Filter by question identifiers
192    pub fn question_ids(mut self, question_ids: impl IntoIterator<Item = impl ToString>) -> Self {
193        self.request = self.request.query_many("question_ids", question_ids);
194        self
195    }
196
197    /// Include tag data in results
198    pub fn include_tag(mut self, include: bool) -> Self {
199        self.request = self.request.query("include_tag", include);
200        self
201    }
202
203    /// Filter for closed or active markets
204    pub fn closed(mut self, closed: bool) -> Self {
205        self.request = self.request.query("closed", closed);
206        self
207    }
208
209    /// Filter by active status (convenience method, opposite of closed)
210    pub fn active(mut self, active: bool) -> Self {
211        self.request = self.request.query("closed", !active);
212        self
213    }
214
215    /// Filter by archived status
216    pub fn archived(mut self, archived: bool) -> Self {
217        self.request = self.request.query("archived", archived);
218        self
219    }
220
221    /// Execute the request
222    pub async fn send(self) -> crate::error::Result<Vec<Market>> {
223        self.request.send().await
224    }
225}