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/// Event containing multiple markets
169#[derive(Debug, Clone, Serialize, Deserialize)]
170#[serde(rename_all(deserialize = "camelCase"))]
171pub struct Event {
172    pub id: String,
173    pub slug: String,
174    pub title: String,
175    pub description: Option<String>,
176    pub start_date_iso: Option<String>,
177    pub end_date_iso: Option<String>,
178    pub image: Option<String>,
179    pub icon: Option<String>,
180    pub active: bool,
181    pub closed: bool,
182    pub archived: bool,
183    pub new: Option<bool>,
184    pub featured: bool,
185    pub restricted: bool,
186    pub liquidity: Option<f64>,
187    pub volume: Option<f64>,
188    pub volume_24hr: Option<f64>,
189    // Use i64 instead of u64 to prevent sentinel value
190    pub comment_count: Option<i64>,
191    #[serde(default)]
192    pub markets: Vec<Market>,
193    pub cyom: Option<bool>,
194    pub competitive: Option<f64>,
195    #[serde(default)]
196    pub tags: Vec<Tag>,
197    #[serde(default)]
198    pub series: Vec<SeriesInfo>,
199}
200
201/// Series information within an event
202#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(rename_all(deserialize = "camelCase"))]
204pub struct SeriesInfo {
205    pub id: String,
206    pub slug: String,
207    pub title: String,
208}
209
210/// Series data (tournament/season grouping)
211#[derive(Debug, Clone, Serialize, Deserialize)]
212#[serde(rename_all(deserialize = "camelCase"))]
213pub struct SeriesData {
214    pub id: String,
215    pub slug: String,
216    pub title: String,
217    pub description: Option<String>,
218    pub image: Option<String>,
219    pub icon: Option<String>,
220    pub active: bool,
221    pub closed: bool,
222    pub archived: bool,
223    #[serde(default)]
224    pub tags: Vec<String>,
225    pub volume: Option<f64>,
226    pub liquidity: Option<f64>,
227    #[serde(default)]
228    pub events: Vec<Event>,
229    pub competitive: Option<String>,
230}
231
232/// Tag for categorizing markets/events
233#[derive(Debug, Clone, Serialize, Deserialize)]
234#[serde(rename_all(deserialize = "camelCase"))]
235pub struct Tag {
236    pub id: String,
237    pub slug: String,
238    pub label: String,
239    pub force_show: Option<bool>,
240    pub published_at: Option<String>,
241    pub created_by: Option<u64>,
242    pub updated_by: Option<u64>,
243    pub created_at: Option<String>,
244    pub updated_at: Option<String>,
245    pub force_hide: Option<bool>,
246    pub is_carousel: Option<bool>,
247}
248
249/// Sports metadata
250#[derive(Debug, Clone, Serialize, Deserialize)]
251#[serde(rename_all(deserialize = "camelCase"))]
252pub struct SportMetadata {
253    pub id: u64,
254    pub sport: String,
255    pub image: Option<String>,
256    pub resolution: Option<String>,
257    pub ordering: Option<String>,
258    pub tags: Option<String>,
259    pub series: Option<String>,
260    pub created_at: Option<String>,
261}
262
263/// Sports team
264#[derive(Debug, Clone, Serialize, Deserialize)]
265#[serde(rename_all(deserialize = "camelCase"))]
266pub struct Team {
267    pub id: i64,
268    pub name: Option<String>,
269    pub league: Option<String>,
270    pub record: Option<String>,
271    pub logo: Option<String>,
272    pub abbreviation: Option<String>,
273    pub alias: Option<String>,
274    pub created_at: Option<DateTime<Utc>>,
275    pub updated_at: Option<DateTime<Utc>>,
276}
277
278/// Comment on a market/event/series
279#[derive(Debug, Clone, Serialize, Deserialize)]
280#[serde(rename_all(deserialize = "camelCase"))]
281pub struct Comment {
282    pub id: String,
283    pub body: String,
284    pub created_at: DateTime<Utc>,
285    pub updated_at: DateTime<Utc>,
286    pub deleted_at: Option<DateTime<Utc>>,
287    pub user: CommentUser,
288    pub market_id: Option<String>,
289    pub event_id: Option<String>,
290    pub series_id: Option<String>,
291    pub parent_id: Option<String>,
292    #[serde(default)]
293    pub reactions: Vec<CommentReaction>,
294    #[serde(default)]
295    pub positions: Vec<CommentPosition>,
296    pub like_count: u32,
297    pub dislike_count: u32,
298    pub reply_count: u32,
299}
300
301/// User who created a comment
302#[derive(Debug, Clone, Serialize, Deserialize)]
303#[serde(rename_all(deserialize = "camelCase"))]
304pub struct CommentUser {
305    pub id: String,
306    pub name: String,
307    pub avatar: Option<String>,
308}
309
310/// Reaction to a comment
311#[derive(Debug, Clone, Serialize, Deserialize)]
312#[serde(rename_all(deserialize = "camelCase"))]
313pub struct CommentReaction {
314    pub user_id: String,
315    pub reaction_type: String,
316}
317
318/// Position held by comment author
319#[derive(Debug, Clone, Serialize, Deserialize)]
320#[serde(rename_all(deserialize = "camelCase"))]
321pub struct CommentPosition {
322    pub token_id: String,
323    pub outcome: String,
324    pub shares: String,
325}
326
327/// Pagination cursor for list operations
328#[derive(Debug, Clone, Serialize, Deserialize)]
329#[serde(rename_all(deserialize = "camelCase"))]
330pub struct Cursor {
331    pub next_cursor: Option<String>,
332}
333
334/// Paginated response wrapper
335#[derive(Debug, Clone, Serialize, Deserialize)]
336#[serde(rename_all(deserialize = "camelCase"))]
337pub struct PaginatedResponse<T> {
338    pub data: Vec<T>,
339    pub next_cursor: Option<String>,
340}