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    pub comment_count: Option<u32>,
38    pub twitter_card_image: Option<String>,
39    pub resolution_source: Option<String>,
40    pub amm_type: Option<String>,
41    pub sponsor_name: Option<String>,
42    pub sponsor_image: Option<String>,
43    pub x_axis_value: Option<String>,
44    pub y_axis_value: Option<String>,
45    pub denomation_token: Option<String>,
46    pub fee: Option<String>,
47    pub image: Option<String>,
48    pub icon: Option<String>,
49    pub lower_bound: Option<String>,
50    pub upper_bound: Option<String>,
51    pub outcomes: Option<String>,
52    pub outcome_prices: Option<String>,
53    pub volume: Option<String>,
54    pub active: Option<bool>,
55    pub market_type: Option<String>,
56    pub format_type: Option<String>,
57    pub lower_bound_date: Option<String>,
58    pub upper_bound_date: Option<String>,
59    pub closed: Option<bool>,
60    pub market_maker_address: String,
61    pub created_by: Option<i64>,
62    pub updated_by: Option<i64>,
63    pub created_at: Option<String>,
64    pub updated_at: Option<String>,
65    pub closed_time: Option<String>,
66    pub wide_format: Option<bool>,
67    pub new: Option<bool>,
68    pub mailchimp_tag: Option<String>,
69    pub featured: Option<bool>,
70    pub archived: Option<bool>,
71    pub resolved_by: Option<String>,
72    pub restricted: Option<bool>,
73    pub market_group: Option<i64>,
74    pub group_item_title: Option<String>,
75    pub group_item_threshold: Option<String>,
76    pub uma_end_date: Option<String>,
77    pub uma_resolution_status: Option<String>,
78    pub uma_end_date_iso: Option<String>,
79    pub uma_resolution_statuses: Option<String>,
80    pub enable_order_book: Option<bool>,
81    pub order_price_min_tick_size: Option<f64>,
82    pub order_min_size: Option<f64>,
83    pub curation_order: Option<i64>,
84    pub volume_num: Option<f64>,
85    pub liquidity_num: Option<f64>,
86    pub has_review_dates: Option<bool>,
87    pub ready_for_cron: Option<bool>,
88    pub comments_enabled: Option<bool>,
89    pub game_start_time: Option<String>,
90    pub seconds_delay: Option<i64>,
91    pub clob_token_ids: Option<String>,
92    pub disqus_thread: Option<String>,
93    pub short_outcomes: Option<String>,
94    pub team_aid: Option<String>,
95    pub team_bid: Option<String>,
96    pub uma_bond: Option<String>,
97    pub uma_reward: Option<String>,
98    pub fpmm_live: Option<bool>,
99    pub volume_24hr_amm: Option<f64>,
100    pub volume_1wk_amm: Option<f64>,
101    pub volume_1mo_amm: Option<f64>,
102    pub volume_1yr_amm: Option<f64>,
103    pub volume_24hr_clob: Option<f64>,
104    pub volume_1wk_clob: Option<f64>,
105    pub volume_1mo_clob: Option<f64>,
106    pub volume_1yr_clob: Option<f64>,
107    pub volume_amm: Option<f64>,
108    pub volume_clob: Option<f64>,
109    pub liquidity_amm: Option<f64>,
110    pub liquidity_clob: Option<f64>,
111    pub maker_base_fee: Option<i64>,
112    pub taker_base_fee: Option<i64>,
113    pub custom_liveness: Option<i64>,
114    pub accepting_orders: Option<bool>,
115    pub notifications_enabled: Option<bool>,
116    pub score: Option<i64>,
117    pub creator: Option<String>,
118    pub ready: Option<bool>,
119    pub funded: Option<bool>,
120    pub past_slugs: Option<String>,
121    pub ready_timestamp: Option<String>,
122    pub funded_timestamp: Option<String>,
123    pub accepting_orders_timestamp: Option<String>,
124    pub competitive: Option<f64>,
125    pub rewards_min_size: Option<f64>,
126    pub rewards_max_spreads: Option<f64>,
127    pub spread: Option<f64>,
128    pub automatically_resolved: Option<bool>,
129    pub automatically_active: Option<bool>,
130    pub one_day_price_change: Option<f64>,
131    pub one_hour_price_change: Option<f64>,
132    pub one_week_price_change: Option<f64>,
133    pub one_month_price_change: Option<f64>,
134    pub one_year_price_change: Option<f64>,
135    pub last_trade_price: Option<f64>,
136    pub best_bid: Option<f64>,
137    pub best_ask: Option<f64>,
138    pub clear_book_on_start: Option<bool>,
139    pub chart_color: Option<String>,
140    pub series_color: Option<String>,
141    pub show_gmp_series: Option<bool>,
142    pub show_gmp_outcome: Option<bool>,
143    pub manual_activation: Option<bool>,
144    pub neg_risk_other: Option<bool>,
145    pub game_id: Option<String>,
146    pub group_item_range: Option<String>,
147    pub sports_market_type: Option<String>,
148    pub line: Option<f64>,
149    pub pending_deployment: Option<bool>,
150    pub deploying: Option<bool>,
151    pub deploying_timestamp: Option<String>,
152    pub schedule_deployment_timestamp: Option<String>,
153    pub rfq_enabled: Option<bool>,
154    pub event_start_time: Option<String>,
155}
156
157/// Market token (outcome)
158#[derive(Debug, Clone, Serialize, Deserialize)]
159#[serde(rename_all(deserialize = "camelCase"))]
160pub struct MarketToken {
161    pub token_id: String,
162    pub outcome: String,
163    pub price: Option<String>,
164    pub winner: Option<bool>,
165}
166
167/// Event containing multiple markets
168#[derive(Debug, Clone, Serialize, Deserialize)]
169#[serde(rename_all(deserialize = "camelCase"))]
170pub struct Event {
171    pub id: String,
172    pub slug: String,
173    pub title: String,
174    pub description: Option<String>,
175    pub start_date_iso: Option<String>,
176    pub end_date_iso: Option<String>,
177    pub image: Option<String>,
178    pub icon: Option<String>,
179    pub active: bool,
180    pub closed: bool,
181    pub archived: bool,
182    pub new: Option<bool>,
183    pub featured: bool,
184    pub restricted: bool,
185    pub liquidity: Option<f64>,
186    pub volume: Option<f64>,
187    pub volume_24hr: Option<f64>,
188    pub comment_count: Option<u32>,
189    #[serde(default)]
190    pub markets: Vec<Market>,
191    pub cyom: Option<bool>,
192    pub competitive: Option<f64>,
193    #[serde(default)]
194    pub tags: Vec<Tag>,
195    #[serde(default)]
196    pub series: Vec<SeriesInfo>,
197}
198
199/// Series information within an event
200#[derive(Debug, Clone, Serialize, Deserialize)]
201#[serde(rename_all(deserialize = "camelCase"))]
202pub struct SeriesInfo {
203    pub id: String,
204    pub slug: String,
205    pub title: String,
206}
207
208/// Series data (tournament/season grouping)
209#[derive(Debug, Clone, Serialize, Deserialize)]
210#[serde(rename_all(deserialize = "camelCase"))]
211pub struct SeriesData {
212    pub id: String,
213    pub slug: String,
214    pub title: String,
215    pub description: Option<String>,
216    pub image: Option<String>,
217    pub icon: Option<String>,
218    pub active: bool,
219    pub closed: bool,
220    pub archived: bool,
221    #[serde(default)]
222    pub tags: Vec<String>,
223    pub volume: Option<f64>,
224    pub liquidity: Option<f64>,
225    #[serde(default)]
226    pub events: Vec<Event>,
227    pub competitive: Option<String>,
228}
229
230/// Tag for categorizing markets/events
231#[derive(Debug, Clone, Serialize, Deserialize)]
232#[serde(rename_all(deserialize = "camelCase"))]
233pub struct Tag {
234    pub id: String,
235    pub slug: String,
236    pub label: String,
237    pub force_show: Option<bool>,
238    pub published_at: Option<String>,
239    pub created_by: Option<u64>,
240    pub updated_by: Option<u64>,
241    pub created_at: Option<String>,
242    pub updated_at: Option<String>,
243    pub force_hide: Option<bool>,
244    pub is_carousel: Option<bool>,
245}
246
247/// Sports metadata
248#[derive(Debug, Clone, Serialize, Deserialize)]
249#[serde(rename_all(deserialize = "camelCase"))]
250pub struct SportMetadata {
251    pub id: u64,
252    pub sport: String,
253    pub image: Option<String>,
254    pub resolution: Option<String>,
255    pub ordering: Option<String>,
256    pub tags: Option<String>,
257    pub series: Option<String>,
258    pub created_at: Option<String>,
259}
260
261/// Sports team
262#[derive(Debug, Clone, Serialize, Deserialize)]
263#[serde(rename_all(deserialize = "camelCase"))]
264pub struct Team {
265    pub id: i64,
266    pub name: Option<String>,
267    pub league: Option<String>,
268    pub record: Option<String>,
269    pub logo: Option<String>,
270    pub abbreviation: Option<String>,
271    pub alias: Option<String>,
272    pub created_at: Option<DateTime<Utc>>,
273    pub updated_at: Option<DateTime<Utc>>,
274}
275
276/// Comment on a market/event/series
277#[derive(Debug, Clone, Serialize, Deserialize)]
278#[serde(rename_all(deserialize = "camelCase"))]
279pub struct Comment {
280    pub id: String,
281    pub body: String,
282    pub created_at: DateTime<Utc>,
283    pub updated_at: DateTime<Utc>,
284    pub deleted_at: Option<DateTime<Utc>>,
285    pub user: CommentUser,
286    pub market_id: Option<String>,
287    pub event_id: Option<String>,
288    pub series_id: Option<String>,
289    pub parent_id: Option<String>,
290    #[serde(default)]
291    pub reactions: Vec<CommentReaction>,
292    #[serde(default)]
293    pub positions: Vec<CommentPosition>,
294    pub like_count: u32,
295    pub dislike_count: u32,
296    pub reply_count: u32,
297}
298
299/// User who created a comment
300#[derive(Debug, Clone, Serialize, Deserialize)]
301#[serde(rename_all(deserialize = "camelCase"))]
302pub struct CommentUser {
303    pub id: String,
304    pub name: String,
305    pub avatar: Option<String>,
306}
307
308/// Reaction to a comment
309#[derive(Debug, Clone, Serialize, Deserialize)]
310#[serde(rename_all(deserialize = "camelCase"))]
311pub struct CommentReaction {
312    pub user_id: String,
313    pub reaction_type: String,
314}
315
316/// Position held by comment author
317#[derive(Debug, Clone, Serialize, Deserialize)]
318#[serde(rename_all(deserialize = "camelCase"))]
319pub struct CommentPosition {
320    pub token_id: String,
321    pub outcome: String,
322    pub shares: String,
323}
324
325/// Pagination cursor for list operations
326#[derive(Debug, Clone, Serialize, Deserialize)]
327#[serde(rename_all(deserialize = "camelCase"))]
328pub struct Cursor {
329    pub next_cursor: Option<String>,
330}
331
332/// Paginated response wrapper
333#[derive(Debug, Clone, Serialize, Deserialize)]
334#[serde(rename_all(deserialize = "camelCase"))]
335pub struct PaginatedResponse<T> {
336    pub data: Vec<T>,
337    pub next_cursor: Option<String>,
338}