1use serde::Deserialize;
2
3use crate::{NumberString, model::InstType};
4
5#[derive(Debug, Clone, Deserialize)]
7#[serde(rename_all = "camelCase")]
8#[non_exhaustive]
9pub struct Ticker {
10 pub inst_type: InstType,
12 pub inst_id: String,
14 pub last: NumberString,
16 #[serde(default)]
18 pub last_sz: NumberString,
19 #[serde(default)]
21 pub ask_px: NumberString,
22 #[serde(default)]
24 pub ask_sz: NumberString,
25 #[serde(default)]
27 pub bid_px: NumberString,
28 #[serde(default)]
30 pub bid_sz: NumberString,
31 #[serde(default)]
33 pub open24h: NumberString,
34 #[serde(default)]
36 pub high24h: NumberString,
37 #[serde(default)]
39 pub low24h: NumberString,
40 #[serde(default)]
42 pub vol24h: NumberString,
43 #[serde(default)]
45 pub vol_ccy24h: NumberString,
46 #[serde(default)]
48 pub sod_utc0: NumberString,
49 #[serde(default)]
51 pub sod_utc8: NumberString,
52 pub ts: NumberString,
54}
55
56#[derive(Debug, Clone, Deserialize)]
58#[serde(rename_all = "camelCase")]
59#[non_exhaustive]
60pub struct IndexTicker {
61 pub inst_id: String,
63 #[serde(default)]
65 pub idx_px: NumberString,
66 #[serde(default)]
68 pub open24h: NumberString,
69 #[serde(default)]
71 pub high24h: NumberString,
72 #[serde(default)]
74 pub low24h: NumberString,
75 #[serde(default)]
77 pub sod_utc0: NumberString,
78 #[serde(default)]
80 pub sod_utc8: NumberString,
81 #[serde(default)]
83 pub ts: NumberString,
84}
85
86#[derive(Debug, Clone, Deserialize)]
88#[serde(rename_all = "camelCase")]
89#[non_exhaustive]
90pub struct OrderBook {
91 pub asks: Vec<OrderBookLevel>,
93 pub bids: Vec<OrderBookLevel>,
95 pub ts: NumberString,
97 #[serde(default)]
99 pub seq_id: i64,
100}
101
102#[derive(Debug, Clone, Deserialize)]
107#[serde(from = "BookLevelRaw")]
108#[non_exhaustive]
109pub struct OrderBookLevel {
110 pub price: NumberString,
112 pub size: NumberString,
114 pub deprecated: NumberString,
116 pub order_count: NumberString,
118}
119
120type BookLevelRaw = (NumberString, NumberString, NumberString, NumberString);
121
122impl From<BookLevelRaw> for OrderBookLevel {
123 fn from(raw: BookLevelRaw) -> Self {
124 Self {
125 price: raw.0,
126 size: raw.1,
127 deprecated: raw.2,
128 order_count: raw.3,
129 }
130 }
131}
132
133#[derive(Debug, Clone, Deserialize)]
137#[serde(from = "CandleRaw")]
138#[non_exhaustive]
139pub struct Candle {
140 pub ts: NumberString,
142 pub open: NumberString,
144 pub high: NumberString,
146 pub low: NumberString,
148 pub close: NumberString,
150 pub vol: NumberString,
152 pub vol_ccy: NumberString,
154 pub vol_ccy_quote: NumberString,
156 pub confirm: NumberString,
158}
159
160type CandleRaw = (
161 NumberString,
162 NumberString,
163 NumberString,
164 NumberString,
165 NumberString,
166 NumberString,
167 NumberString,
168 NumberString,
169 NumberString,
170);
171
172impl From<CandleRaw> for Candle {
173 fn from(raw: CandleRaw) -> Self {
174 Self {
175 ts: raw.0,
176 open: raw.1,
177 high: raw.2,
178 low: raw.3,
179 close: raw.4,
180 vol: raw.5,
181 vol_ccy: raw.6,
182 vol_ccy_quote: raw.7,
183 confirm: raw.8,
184 }
185 }
186}
187
188#[derive(Debug, Clone, Deserialize)]
190#[serde(rename_all = "camelCase")]
191#[non_exhaustive]
192pub struct MarketTrade {
193 pub inst_id: String,
195 #[serde(default)]
197 pub trade_id: String,
198 #[serde(default)]
200 pub px: NumberString,
201 #[serde(default)]
203 pub sz: NumberString,
204 #[serde(default)]
206 pub side: String,
207 #[serde(default)]
209 pub source: String,
210 #[serde(default)]
212 pub ts: NumberString,
213}
214
215#[derive(Debug, Clone, Deserialize)]
220#[serde(rename_all = "camelCase")]
221#[non_exhaustive]
222pub struct BlockTicker {
223 #[serde(default)]
225 pub inst_type: String,
226 #[serde(default)]
228 pub inst_id: String,
229 #[serde(default)]
231 pub last: NumberString,
232 #[serde(default)]
234 pub last_sz: NumberString,
235 #[serde(default)]
237 pub ask_px: NumberString,
238 #[serde(default)]
240 pub ask_sz: NumberString,
241 #[serde(default)]
243 pub bid_px: NumberString,
244 #[serde(default)]
246 pub bid_sz: NumberString,
247 #[serde(default)]
249 pub open24h: NumberString,
250 #[serde(default)]
252 pub high24h: NumberString,
253 #[serde(default)]
255 pub low24h: NumberString,
256 #[serde(default)]
258 pub vol24h: NumberString,
259 #[serde(default)]
261 pub vol_ccy24h: NumberString,
262 #[serde(default)]
264 pub sod_utc0: NumberString,
265 #[serde(default)]
267 pub sod_utc8: NumberString,
268 #[serde(default)]
270 pub ts: NumberString,
271}
272
273pub type BlockTrade = MarketTrade;
275
276#[derive(Debug, Clone, Deserialize)]
278#[serde(rename_all = "camelCase")]
279#[non_exhaustive]
280pub struct OptionInstrumentFamilyTrade {
281 #[serde(default)]
283 pub inst_id: String,
284 #[serde(default)]
286 pub inst_family: String,
287 #[serde(default)]
289 pub trade_id: String,
290 #[serde(default)]
292 pub px: NumberString,
293 #[serde(default)]
295 pub sz: NumberString,
296 #[serde(default)]
298 pub side: String,
299 #[serde(default)]
301 pub ts: NumberString,
302}
303
304#[derive(Debug, Clone, Deserialize)]
306#[serde(rename_all = "camelCase")]
307#[non_exhaustive]
308pub struct PlatformVolume {
309 #[serde(default)]
311 pub vol_usd: NumberString,
312 #[serde(default)]
314 pub vol_cny: NumberString,
315 #[serde(default)]
317 pub ts: NumberString,
318}
319
320#[derive(Debug, Clone, Deserialize)]
322#[serde(rename_all = "camelCase")]
323#[non_exhaustive]
324pub struct IndexComponents {
325 #[serde(default)]
327 pub index: String,
328 #[serde(default)]
330 pub last: NumberString,
331 #[serde(default)]
333 pub components: Vec<IndexComponent>,
334 #[serde(default)]
336 pub ts: NumberString,
337}
338
339#[derive(Debug, Clone, Deserialize)]
341#[serde(rename_all = "camelCase")]
342#[non_exhaustive]
343pub struct IndexComponent {
344 #[serde(default)]
346 pub exch: String,
347 #[serde(default)]
349 pub symbol: String,
350 #[serde(default)]
352 pub sym_px: NumberString,
353 #[serde(default)]
355 pub wgt: NumberString,
356 #[serde(default)]
358 pub cnv_px: NumberString,
359}
360
361#[derive(Debug, Clone, Deserialize)]
363#[serde(rename_all = "camelCase")]
364#[non_exhaustive]
365pub struct ExchangeRate {
366 #[serde(default)]
368 pub usd_cny: NumberString,
369}
370
371#[derive(Debug, Clone, Deserialize)]
373#[serde(from = "IndexCandleRaw")]
374#[non_exhaustive]
375pub struct IndexCandle {
376 pub ts: NumberString,
378 pub open: NumberString,
380 pub high: NumberString,
382 pub low: NumberString,
384 pub close: NumberString,
386 pub confirm: NumberString,
388}
389
390type IndexCandleRaw = (
391 NumberString,
392 NumberString,
393 NumberString,
394 NumberString,
395 NumberString,
396 NumberString,
397);
398
399impl From<IndexCandleRaw> for IndexCandle {
400 fn from(raw: IndexCandleRaw) -> Self {
401 Self {
402 ts: raw.0,
403 open: raw.1,
404 high: raw.2,
405 low: raw.3,
406 close: raw.4,
407 confirm: raw.5,
408 }
409 }
410}
411
412#[derive(Debug, Clone, Deserialize)]
414#[serde(rename_all = "camelCase")]
415#[non_exhaustive]
416pub struct OptionFamilyTradeGroup {
417 #[serde(default)]
419 pub vol24h: NumberString,
420 #[serde(default)]
422 pub opt_type: String,
423 #[serde(default)]
425 pub trade_info: Vec<OptionInstrumentFamilyTrade>,
426}