1use std::collections::HashMap;
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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}