polyte_gamma/
types.rs

1use std::collections::HashMap;
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6/// Market data from Gamma API
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all(deserialize = "camelCase"))]
9pub struct Market {
10    pub id: String,
11    pub condition_id: String,
12    pub question_id: Option<String>,
13    pub slug: Option<String>,
14    #[serde(default)]
15    pub tokens: Vec<MarketToken>,
16    pub rewards: Option<HashMap<String, serde_json::Value>>,
17    pub minimum_order_size: Option<String>,
18    pub minimum_tick_size: Option<String>,
19    pub description: String,
20    pub category: Option<String>,
21    pub end_date_iso: Option<String>,
22    pub start_date_iso: Option<String>,
23    pub question: String,
24    pub min_incentive_size: Option<String>,
25    pub max_incentive_spread: Option<String>,
26    pub submitted_by: Option<String>,
27    pub volume_24hr: Option<f64>,
28    pub volume_1wk: Option<f64>,
29    pub volume_1mo: Option<f64>,
30    pub volume_1yr: Option<f64>,
31    pub liquidity: Option<String>,
32    #[serde(default)]
33    pub tags: Vec<Tag>,
34    pub neg_risk: Option<bool>,
35    pub neg_risk_market_id: Option<String>,
36    pub neg_risk_request_id: Option<String>,
37    // Use i64 instead of u64 to prevent sentinel value
38    pub comment_count: Option<i64>,
39    pub twitter_card_image: Option<String>,
40    pub resolution_source: Option<String>,
41    pub amm_type: Option<String>,
42    pub sponsor_name: Option<String>,
43    pub sponsor_image: Option<String>,
44    pub x_axis_value: Option<String>,
45    pub y_axis_value: Option<String>,
46    pub denomation_token: Option<String>,
47    pub fee: Option<String>,
48    pub image: Option<String>,
49    pub icon: Option<String>,
50    pub lower_bound: Option<String>,
51    pub upper_bound: Option<String>,
52    pub outcomes: Option<String>,
53    pub outcome_prices: Option<String>,
54    pub volume: Option<String>,
55    pub active: Option<bool>,
56    pub market_type: Option<String>,
57    pub format_type: Option<String>,
58    pub lower_bound_date: Option<String>,
59    pub upper_bound_date: Option<String>,
60    pub closed: Option<bool>,
61    pub market_maker_address: String,
62    pub created_by: Option<i64>,
63    pub updated_by: Option<i64>,
64    pub created_at: Option<String>,
65    pub updated_at: Option<String>,
66    pub closed_time: Option<String>,
67    pub wide_format: Option<bool>,
68    pub new: Option<bool>,
69    pub mailchimp_tag: Option<String>,
70    pub featured: Option<bool>,
71    pub archived: Option<bool>,
72    pub resolved_by: Option<String>,
73    pub restricted: Option<bool>,
74    pub market_group: Option<i64>,
75    pub group_item_title: Option<String>,
76    pub group_item_threshold: Option<String>,
77    pub uma_end_date: Option<String>,
78    pub uma_resolution_status: Option<String>,
79    pub uma_end_date_iso: Option<String>,
80    pub uma_resolution_statuses: Option<String>,
81    pub enable_order_book: Option<bool>,
82    pub order_price_min_tick_size: Option<f64>,
83    pub order_min_size: Option<f64>,
84    pub curation_order: Option<i64>,
85    pub volume_num: Option<f64>,
86    pub liquidity_num: Option<f64>,
87    pub has_review_dates: Option<bool>,
88    pub ready_for_cron: Option<bool>,
89    pub comments_enabled: Option<bool>,
90    pub game_start_time: Option<String>,
91    pub seconds_delay: Option<i64>,
92    pub clob_token_ids: Option<String>,
93    pub disqus_thread: Option<String>,
94    pub short_outcomes: Option<String>,
95    pub team_aid: Option<String>,
96    pub team_bid: Option<String>,
97    pub uma_bond: Option<String>,
98    pub uma_reward: Option<String>,
99    pub fpmm_live: Option<bool>,
100    pub volume_24hr_amm: Option<f64>,
101    pub volume_1wk_amm: Option<f64>,
102    pub volume_1mo_amm: Option<f64>,
103    pub volume_1yr_amm: Option<f64>,
104    pub volume_24hr_clob: Option<f64>,
105    pub volume_1wk_clob: Option<f64>,
106    pub volume_1mo_clob: Option<f64>,
107    pub volume_1yr_clob: Option<f64>,
108    pub volume_amm: Option<f64>,
109    pub volume_clob: Option<f64>,
110    pub liquidity_amm: Option<f64>,
111    pub liquidity_clob: Option<f64>,
112    pub maker_base_fee: Option<i64>,
113    pub taker_base_fee: Option<i64>,
114    pub custom_liveness: Option<i64>,
115    pub accepting_orders: Option<bool>,
116    pub notifications_enabled: Option<bool>,
117    pub score: Option<i64>,
118    pub creator: Option<String>,
119    pub ready: Option<bool>,
120    pub funded: Option<bool>,
121    pub past_slugs: Option<String>,
122    pub ready_timestamp: Option<String>,
123    pub funded_timestamp: Option<String>,
124    pub accepting_orders_timestamp: Option<String>,
125    pub competitive: Option<f64>,
126    pub rewards_min_size: Option<f64>,
127    pub rewards_max_spreads: Option<f64>,
128    pub spread: Option<f64>,
129    pub automatically_resolved: Option<bool>,
130    pub automatically_active: Option<bool>,
131    pub one_day_price_change: Option<f64>,
132    pub one_hour_price_change: Option<f64>,
133    pub one_week_price_change: Option<f64>,
134    pub one_month_price_change: Option<f64>,
135    pub one_year_price_change: Option<f64>,
136    pub last_trade_price: Option<f64>,
137    pub best_bid: Option<f64>,
138    pub best_ask: Option<f64>,
139    pub clear_book_on_start: Option<bool>,
140    pub chart_color: Option<String>,
141    pub series_color: Option<String>,
142    pub show_gmp_series: Option<bool>,
143    pub show_gmp_outcome: Option<bool>,
144    pub manual_activation: Option<bool>,
145    pub neg_risk_other: Option<bool>,
146    pub game_id: Option<String>,
147    pub group_item_range: Option<String>,
148    pub sports_market_type: Option<String>,
149    pub line: Option<f64>,
150    pub pending_deployment: Option<bool>,
151    pub deploying: Option<bool>,
152    pub deploying_timestamp: Option<String>,
153    pub schedule_deployment_timestamp: Option<String>,
154    pub rfq_enabled: Option<bool>,
155    pub event_start_time: Option<String>,
156}
157
158/// Market token (outcome)
159#[derive(Debug, Clone, Serialize, Deserialize)]
160#[serde(rename_all(deserialize = "camelCase"))]
161pub struct MarketToken {
162    pub token_id: String,
163    pub outcome: String,
164    pub price: Option<String>,
165    pub winner: Option<bool>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
169#[serde(rename_all(deserialize = "camelCase"))]
170pub struct Event {
171    pub id: String,
172    pub ticker: Option<String>,
173    pub slug: Option<String>,
174    pub title: Option<String>,
175    pub subtitle: Option<String>,
176    pub description: Option<String>,
177    pub resolution_source: Option<String>,
178    pub start_date: Option<String>,
179    pub creation_date: Option<String>,
180    pub end_date: Option<String>,
181    pub image: Option<String>,
182    pub icon: Option<String>,
183    pub start_date_iso: Option<String>,
184    pub end_date_iso: Option<String>,
185    pub active: Option<bool>,
186    pub closed: Option<bool>,
187    pub archived: Option<bool>,
188    pub new: Option<bool>,
189    pub featured: Option<bool>,
190    pub restricted: Option<bool>,
191    pub liquidity: Option<f64>,
192    pub open_interest: Option<f64>,
193    pub sort_by: Option<String>,
194    pub category: Option<String>,
195    pub subcategory: Option<String>,
196    pub is_template: Option<bool>,
197    pub template_variables: Option<String>,
198    pub published_at: Option<String>,
199    pub created_by: Option<String>,
200    pub updated_by: Option<String>,
201    pub created_at: Option<String>,
202    pub updated_at: Option<String>,
203    pub comments_enabled: Option<bool>,
204    pub competitive: Option<f64>,
205    #[serde(rename = "volume24h")]
206    pub volume_24hr: Option<f64>,
207    #[serde(rename = "volume1wk")]
208    pub volume_1wk: Option<f64>,
209    #[serde(rename = "volume1mo")]
210    pub volume_1mo: Option<f64>,
211    #[serde(rename = "volume1yr")]
212    pub volume_1yr: Option<f64>,
213    pub featured_image: Option<String>,
214    pub disqus_thread: Option<String>,
215    pub parent_event: Option<String>,
216    pub enable_order_book: Option<bool>,
217    pub liquidity_amm: Option<f64>,
218    pub liquidity_clob: Option<f64>,
219    pub neg_risk: Option<bool>,
220    pub neg_risk_market_id: Option<String>,
221    pub neg_risk_fee_bips: Option<i64>,
222    #[serde(default)]
223    pub sub_events: Vec<String>,
224    #[serde(default)]
225    pub markets: Vec<Market>,
226    #[serde(default)]
227    pub tags: Vec<Tag>,
228    #[serde(default)]
229    pub series: Vec<SeriesInfo>,
230    pub cyom: Option<bool>,
231    pub closed_time: Option<String>,
232    pub show_all_outcomes: Option<bool>,
233    pub show_market_images: Option<bool>,
234    pub automatically_resolved: Option<bool>,
235    pub enalbe_neg_risk: Option<bool>,
236    pub automatically_active: Option<bool>,
237    pub event_date: Option<String>,
238    pub start_time: Option<String>,
239    pub event_week: Option<i64>,
240    pub series_slug: Option<String>,
241    pub score: Option<String>,
242    pub elapsed: Option<String>,
243    pub period: Option<String>,
244    pub live: Option<bool>,
245    pub ended: Option<bool>,
246    pub finished_timestamp: Option<String>,
247    pub gmp_chart_mode: Option<String>,
248    pub tweet_count: Option<i64>,
249    pub featured_order: Option<i64>,
250    pub estimate_value: Option<bool>,
251    pub cant_estimate: Option<bool>,
252    pub spreads_main_line: Option<f64>,
253    pub totals_main_line: Option<f64>,
254    pub carousel_map: Option<String>,
255    pub pending_deployment: Option<bool>,
256    pub deploying: Option<bool>,
257    pub deploying_timestamp: Option<String>,
258    pub schedule_deployment_timestamp: Option<String>,
259    pub game_status: Option<String>,
260}
261
262/// Series information within an event
263#[derive(Debug, Clone, Serialize, Deserialize)]
264#[serde(rename_all(deserialize = "camelCase"))]
265pub struct SeriesInfo {
266    pub id: String,
267    pub slug: String,
268    pub title: String,
269}
270
271/// Series data (tournament/season grouping)
272#[derive(Debug, Clone, Serialize, Deserialize)]
273#[serde(rename_all(deserialize = "camelCase"))]
274pub struct SeriesData {
275    pub id: String,
276    pub slug: String,
277    pub title: String,
278    pub description: Option<String>,
279    pub image: Option<String>,
280    pub icon: Option<String>,
281    pub active: bool,
282    pub closed: bool,
283    pub archived: bool,
284    #[serde(default)]
285    pub tags: Vec<String>,
286    pub volume: Option<f64>,
287    pub liquidity: Option<f64>,
288    #[serde(default)]
289    pub events: Vec<Event>,
290    pub competitive: Option<String>,
291}
292
293/// Tag for categorizing markets/events
294#[derive(Debug, Clone, Serialize, Deserialize)]
295#[serde(rename_all(deserialize = "camelCase"))]
296pub struct Tag {
297    pub id: String,
298    pub slug: String,
299    pub label: String,
300    pub force_show: Option<bool>,
301    pub published_at: Option<String>,
302    pub created_by: Option<u64>,
303    pub updated_by: Option<u64>,
304    pub created_at: Option<String>,
305    pub updated_at: Option<String>,
306    pub force_hide: Option<bool>,
307    pub is_carousel: Option<bool>,
308}
309
310/// Sports metadata
311#[derive(Debug, Clone, Serialize, Deserialize)]
312#[serde(rename_all(deserialize = "camelCase"))]
313pub struct SportMetadata {
314    pub id: u64,
315    pub sport: String,
316    pub image: Option<String>,
317    pub resolution: Option<String>,
318    pub ordering: Option<String>,
319    pub tags: Option<String>,
320    pub series: Option<String>,
321    pub created_at: Option<String>,
322}
323
324/// Sports team
325#[derive(Debug, Clone, Serialize, Deserialize)]
326#[serde(rename_all(deserialize = "camelCase"))]
327pub struct Team {
328    pub id: i64,
329    pub name: Option<String>,
330    pub league: Option<String>,
331    pub record: Option<String>,
332    pub logo: Option<String>,
333    pub abbreviation: Option<String>,
334    pub alias: Option<String>,
335    pub created_at: Option<DateTime<Utc>>,
336    pub updated_at: Option<DateTime<Utc>>,
337}
338
339/// Comment on a market/event/series
340#[derive(Debug, Clone, Serialize, Deserialize)]
341#[serde(rename_all(deserialize = "camelCase"))]
342pub struct Comment {
343    pub id: String,
344    pub body: String,
345    pub created_at: DateTime<Utc>,
346    pub updated_at: DateTime<Utc>,
347    pub deleted_at: Option<DateTime<Utc>>,
348    pub user: CommentUser,
349    pub market_id: Option<String>,
350    pub event_id: Option<String>,
351    pub series_id: Option<String>,
352    pub parent_id: Option<String>,
353    #[serde(default)]
354    pub reactions: Vec<CommentReaction>,
355    #[serde(default)]
356    pub positions: Vec<CommentPosition>,
357    pub like_count: u32,
358    pub dislike_count: u32,
359    pub reply_count: u32,
360}
361
362/// User who created a comment
363#[derive(Debug, Clone, Serialize, Deserialize)]
364#[serde(rename_all(deserialize = "camelCase"))]
365pub struct CommentUser {
366    pub id: String,
367    pub name: String,
368    pub avatar: Option<String>,
369}
370
371/// Reaction to a comment
372#[derive(Debug, Clone, Serialize, Deserialize)]
373#[serde(rename_all(deserialize = "camelCase"))]
374pub struct CommentReaction {
375    pub user_id: String,
376    pub reaction_type: String,
377}
378
379/// Position held by comment author
380#[derive(Debug, Clone, Serialize, Deserialize)]
381#[serde(rename_all(deserialize = "camelCase"))]
382pub struct CommentPosition {
383    pub token_id: String,
384    pub outcome: String,
385    pub shares: String,
386}
387
388/// Pagination cursor for list operations
389#[derive(Debug, Clone, Serialize, Deserialize)]
390#[serde(rename_all(deserialize = "camelCase"))]
391pub struct Cursor {
392    pub next_cursor: Option<String>,
393}
394
395/// Paginated response wrapper
396#[derive(Debug, Clone, Serialize, Deserialize)]
397#[serde(rename_all(deserialize = "camelCase"))]
398pub struct PaginatedResponse<T> {
399    pub data: Vec<T>,
400    pub next_cursor: Option<String>,
401}