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}
98
99#[derive(Debug, Clone, Deserialize)]
104#[serde(from = "BookLevelRaw")]
105#[non_exhaustive]
106pub struct OrderBookLevel {
107 pub price: NumberString,
109 pub size: NumberString,
111 pub deprecated: NumberString,
113 pub order_count: NumberString,
115}
116
117type BookLevelRaw = (NumberString, NumberString, NumberString, NumberString);
118
119impl From<BookLevelRaw> for OrderBookLevel {
120 fn from(raw: BookLevelRaw) -> Self {
121 Self {
122 price: raw.0,
123 size: raw.1,
124 deprecated: raw.2,
125 order_count: raw.3,
126 }
127 }
128}
129
130#[derive(Debug, Clone, Deserialize)]
134#[serde(from = "CandleRaw")]
135#[non_exhaustive]
136pub struct Candle {
137 pub ts: NumberString,
139 pub open: NumberString,
141 pub high: NumberString,
143 pub low: NumberString,
145 pub close: NumberString,
147 pub vol: NumberString,
149 pub vol_ccy: NumberString,
151 pub vol_ccy_quote: NumberString,
153 pub confirm: NumberString,
155}
156
157type CandleRaw = (
158 NumberString,
159 NumberString,
160 NumberString,
161 NumberString,
162 NumberString,
163 NumberString,
164 NumberString,
165 NumberString,
166 NumberString,
167);
168
169impl From<CandleRaw> for Candle {
170 fn from(raw: CandleRaw) -> Self {
171 Self {
172 ts: raw.0,
173 open: raw.1,
174 high: raw.2,
175 low: raw.3,
176 close: raw.4,
177 vol: raw.5,
178 vol_ccy: raw.6,
179 vol_ccy_quote: raw.7,
180 confirm: raw.8,
181 }
182 }
183}
184
185#[derive(Debug, Clone, Deserialize)]
187#[serde(rename_all = "camelCase")]
188#[non_exhaustive]
189pub struct MarketTrade {
190 pub inst_id: String,
192 #[serde(default)]
194 pub trade_id: String,
195 #[serde(default)]
197 pub px: NumberString,
198 #[serde(default)]
200 pub sz: NumberString,
201 #[serde(default)]
203 pub side: String,
204 #[serde(default)]
206 pub source: String,
207 #[serde(default)]
209 pub ts: NumberString,
210}
211
212#[derive(Debug, Clone, Deserialize)]
217#[serde(rename_all = "camelCase")]
218#[non_exhaustive]
219pub struct BlockTicker {
220 #[serde(default)]
222 pub inst_type: String,
223 #[serde(default)]
225 pub inst_id: String,
226 #[serde(default)]
228 pub last: NumberString,
229 #[serde(default)]
231 pub last_sz: NumberString,
232 #[serde(default)]
234 pub ask_px: NumberString,
235 #[serde(default)]
237 pub ask_sz: NumberString,
238 #[serde(default)]
240 pub bid_px: NumberString,
241 #[serde(default)]
243 pub bid_sz: NumberString,
244 #[serde(default)]
246 pub open24h: NumberString,
247 #[serde(default)]
249 pub high24h: NumberString,
250 #[serde(default)]
252 pub low24h: NumberString,
253 #[serde(default)]
255 pub vol24h: NumberString,
256 #[serde(default)]
258 pub vol_ccy24h: NumberString,
259 #[serde(default)]
261 pub sod_utc0: NumberString,
262 #[serde(default)]
264 pub sod_utc8: NumberString,
265 #[serde(default)]
267 pub ts: NumberString,
268}
269
270pub type BlockTrade = MarketTrade;
272
273#[derive(Debug, Clone, Deserialize)]
275#[serde(rename_all = "camelCase")]
276#[non_exhaustive]
277pub struct OptionInstrumentFamilyTrade {
278 #[serde(default)]
280 pub inst_id: String,
281 #[serde(default)]
283 pub inst_family: String,
284 #[serde(default)]
286 pub trade_id: String,
287 #[serde(default)]
289 pub px: NumberString,
290 #[serde(default)]
292 pub sz: NumberString,
293 #[serde(default)]
295 pub side: String,
296 #[serde(default)]
298 pub ts: NumberString,
299}
300
301#[derive(Debug, Clone, Deserialize)]
303#[serde(rename_all = "camelCase")]
304#[non_exhaustive]
305pub struct PlatformVolume {
306 #[serde(default)]
308 pub vol_usd: NumberString,
309 #[serde(default)]
311 pub vol_cny: NumberString,
312}
313
314#[derive(Debug, Clone, Deserialize)]
316#[serde(rename_all = "camelCase")]
317#[non_exhaustive]
318pub struct IndexComponents {
319 #[serde(default)]
321 pub index: String,
322 #[serde(default)]
324 pub components: Vec<IndexComponent>,
325 #[serde(default)]
327 pub ts: NumberString,
328}
329
330#[derive(Debug, Clone, Deserialize)]
332#[serde(rename_all = "camelCase")]
333#[non_exhaustive]
334pub struct IndexComponent {
335 #[serde(default)]
337 pub exch: String,
338 #[serde(default)]
340 pub symbol: String,
341 #[serde(default)]
343 pub sym_px: NumberString,
344 #[serde(default)]
346 pub wgt: NumberString,
347 #[serde(default)]
349 pub cnv_px: NumberString,
350}
351
352#[derive(Debug, Clone, Deserialize)]
354#[serde(rename_all = "camelCase")]
355#[non_exhaustive]
356pub struct ExchangeRate {
357 #[serde(default)]
359 pub usd_cny: NumberString,
360}
361
362#[derive(Debug, Clone, Deserialize)]
364#[serde(from = "IndexCandleRaw")]
365#[non_exhaustive]
366pub struct IndexCandle {
367 pub ts: NumberString,
369 pub open: NumberString,
371 pub high: NumberString,
373 pub low: NumberString,
375 pub close: NumberString,
377 pub confirm: NumberString,
379}
380
381type IndexCandleRaw = (
382 NumberString,
383 NumberString,
384 NumberString,
385 NumberString,
386 NumberString,
387 NumberString,
388);
389
390impl From<IndexCandleRaw> for IndexCandle {
391 fn from(raw: IndexCandleRaw) -> Self {
392 Self {
393 ts: raw.0,
394 open: raw.1,
395 high: raw.2,
396 low: raw.3,
397 close: raw.4,
398 confirm: raw.5,
399 }
400 }
401}
402
403#[derive(Debug, Clone, Deserialize)]
405#[serde(rename_all = "camelCase")]
406#[non_exhaustive]
407pub struct OptionFamilyTradeGroup {
408 #[serde(default)]
410 pub vol24h: NumberString,
411 #[serde(default)]
413 pub opt_type: String,
414 #[serde(default)]
416 pub trade_info: Vec<OptionInstrumentFamilyTrade>,
417}