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)]
8pub struct Market {
9    #[serde(default)]
10    pub condition_id: Option<String>,
11    #[serde(default)]
12    pub question_id: Option<String>,
13    #[serde(default)]
14    pub tokens: Vec<MarketToken>,
15    #[serde(default)]
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    #[serde(default)]
21    pub category: Option<String>,
22    pub end_date_iso: Option<String>,
23    #[serde(default)]
24    pub game_start_time: Option<String>,
25    pub question: String,
26    #[serde(default)]
27    pub market_slug: Option<String>,
28    pub min_incentive_size: Option<String>,
29    pub max_incentive_spread: Option<String>,
30    pub active: bool,
31    pub closed: bool,
32    pub archived: bool,
33    pub new: Option<bool>,
34    pub featured: Option<bool>,
35    pub submitted_by: Option<String>,
36    pub volume: Option<String>,
37    pub volume_24hr: Option<String>,
38    pub liquidity: Option<String>,
39    #[serde(default)]
40    pub competitive: Option<f64>,
41    #[serde(default)]
42    pub tags: Vec<Tag>,
43    #[serde(default)]
44    pub group_item_threshold: Option<i32>,
45    #[serde(default)]
46    pub group_item_title: Option<String>,
47    #[serde(default)]
48    pub neg_risk: bool,
49    #[serde(default)]
50    pub neg_risk_market_id: Option<String>,
51    #[serde(default)]
52    pub neg_risk_request_id: Option<String>,
53    #[serde(default)]
54    pub enable_order_book: bool,
55    #[serde(default)]
56    pub order_price_min_tick_size: Option<String>,
57    #[serde(default)]
58    pub order_min_size: Option<String>,
59    #[serde(default)]
60    pub seconds_delay: Option<i32>,
61    #[serde(default)]
62    pub icon: Option<String>,
63    #[serde(default)]
64    pub comment_count: u32,
65}
66
67/// Market token (outcome)
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct MarketToken {
70    pub token_id: String,
71    pub outcome: String,
72    #[serde(default)]
73    pub price: Option<String>,
74    #[serde(default)]
75    pub winner: bool,
76}
77
78/// Event containing multiple markets
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct Event {
81    pub id: String,
82    pub slug: String,
83    pub title: String,
84    #[serde(default)]
85    pub description: Option<String>,
86    pub start_date_iso: Option<String>,
87    pub end_date_iso: Option<String>,
88    #[serde(default)]
89    pub image: Option<String>,
90    #[serde(default)]
91    pub icon: Option<String>,
92    pub active: bool,
93    pub closed: bool,
94    pub archived: bool,
95    pub new: Option<bool>,
96    pub featured: bool,
97    pub restricted: bool,
98    pub liquidity: Option<f64>,
99    pub volume: Option<f64>,
100    pub volume_24hr: Option<f64>,
101    pub comment_count: Option<u32>,
102    #[serde(default)]
103    pub markets: Vec<Market>,
104    #[serde(default)]
105    pub cyom: bool,
106    #[serde(default)]
107    pub competitive: Option<f64>,
108    #[serde(default)]
109    pub tags: Vec<Tag>,
110    #[serde(default)]
111    pub series: Vec<SeriesInfo>,
112}
113
114/// Series information within an event
115#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct SeriesInfo {
117    pub id: String,
118    pub slug: String,
119    pub title: String,
120}
121
122/// Series data (tournament/season grouping)
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct SeriesData {
125    pub id: String,
126    pub slug: String,
127    pub title: String,
128    #[serde(default)]
129    pub description: Option<String>,
130    #[serde(default)]
131    pub image: Option<String>,
132    #[serde(default)]
133    pub icon: Option<String>,
134    pub active: bool,
135    pub closed: bool,
136    pub archived: bool,
137    #[serde(default)]
138    pub tags: Vec<String>,
139    pub volume: Option<f64>,
140    pub liquidity: Option<f64>,
141    #[serde(default)]
142    pub events: Vec<Event>,
143    #[serde(default)]
144    pub competitive: Option<String>,
145}
146
147/// Tag for categorizing markets/events
148#[derive(Debug, Clone, Serialize, Deserialize)]
149#[serde(rename_all = "camelCase")]
150pub struct Tag {
151    pub id: String,
152    pub slug: String,
153    pub label: String,
154    pub force_show: Option<bool>,
155    pub published_at: Option<String>,
156    pub created_by: Option<u64>,
157    pub updated_by: Option<u64>,
158    pub created_at: Option<String>,
159    pub updated_at: Option<String>,
160    pub force_hide: Option<bool>,
161    pub is_carousel: Option<bool>,
162}
163
164/// Sports metadata
165#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct SportMetadata {
167    pub id: u64,
168    pub sport: String,
169    #[serde(default)]
170    pub image: Option<String>,
171    #[serde(default)]
172    pub resolution: Option<String>,
173    #[serde(default)]
174    pub ordering: Option<String>,
175    #[serde(default)]
176    pub tags: Option<String>,
177    #[serde(default)]
178    pub series: Option<String>,
179    #[serde(default, rename = "createdAt")]
180    pub created_at: Option<String>,
181}
182
183/// Sports team
184#[derive(Debug, Clone, Serialize, Deserialize)]
185pub struct Team {
186    pub id: i64,
187    #[serde(default)]
188    pub name: Option<String>,
189    #[serde(default)]
190    pub league: Option<String>,
191    #[serde(default)]
192    pub record: Option<String>,
193    #[serde(default)]
194    pub logo: Option<String>,
195    #[serde(default)]
196    pub abbreviation: Option<String>,
197    #[serde(default)]
198    pub alias: Option<String>,
199    #[serde(default, rename = "createdAt")]
200    pub created_at: Option<DateTime<Utc>>,
201    #[serde(default, rename = "updatedAt")]
202    pub updated_at: Option<DateTime<Utc>>,
203}
204
205/// Comment on a market/event/series
206#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct Comment {
208    pub id: String,
209    pub body: String,
210    pub created_at: DateTime<Utc>,
211    pub updated_at: DateTime<Utc>,
212    #[serde(default)]
213    pub deleted_at: Option<DateTime<Utc>>,
214    pub user: CommentUser,
215    #[serde(default)]
216    pub market_id: Option<String>,
217    #[serde(default)]
218    pub event_id: Option<String>,
219    #[serde(default)]
220    pub series_id: Option<String>,
221    #[serde(default)]
222    pub parent_id: Option<String>,
223    #[serde(default)]
224    pub reactions: Vec<CommentReaction>,
225    #[serde(default)]
226    pub positions: Vec<CommentPosition>,
227    pub like_count: u32,
228    pub dislike_count: u32,
229    pub reply_count: u32,
230}
231
232/// User who created a comment
233#[derive(Debug, Clone, Serialize, Deserialize)]
234pub struct CommentUser {
235    pub id: String,
236    pub name: String,
237    #[serde(default)]
238    pub avatar: Option<String>,
239}
240
241/// Reaction to a comment
242#[derive(Debug, Clone, Serialize, Deserialize)]
243pub struct CommentReaction {
244    pub user_id: String,
245    pub reaction_type: String,
246}
247
248/// Position held by comment author
249#[derive(Debug, Clone, Serialize, Deserialize)]
250pub struct CommentPosition {
251    pub token_id: String,
252    pub outcome: String,
253    pub shares: String,
254}
255
256/// Pagination cursor for list operations
257#[derive(Debug, Clone, Serialize, Deserialize)]
258pub struct Cursor {
259    #[serde(default)]
260    pub next_cursor: Option<String>,
261}
262
263/// Paginated response wrapper
264#[derive(Debug, Clone, Serialize, Deserialize)]
265pub struct PaginatedResponse<T> {
266    pub data: Vec<T>,
267    #[serde(default)]
268    pub next_cursor: Option<String>,
269}