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