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