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 pub ts: NumberString,
48}
49
50#[derive(Debug, Clone, Deserialize)]
52#[serde(rename_all = "camelCase")]
53#[non_exhaustive]
54pub struct IndexTicker {
55 pub inst_id: String,
57 #[serde(default)]
59 pub idx_px: NumberString,
60 #[serde(default)]
62 pub open24h: NumberString,
63 #[serde(default)]
65 pub high24h: NumberString,
66 #[serde(default)]
68 pub low24h: NumberString,
69 #[serde(default)]
71 pub ts: NumberString,
72}
73
74#[derive(Debug, Clone, Deserialize)]
76#[non_exhaustive]
77pub struct OrderBook {
78 pub asks: Vec<OrderBookLevel>,
80 pub bids: Vec<OrderBookLevel>,
82 pub ts: NumberString,
84}
85
86#[derive(Debug, Clone, Deserialize)]
91#[serde(from = "BookLevelRaw")]
92#[non_exhaustive]
93pub struct OrderBookLevel {
94 pub price: NumberString,
96 pub size: NumberString,
98 pub deprecated: NumberString,
100 pub order_count: NumberString,
102}
103
104type BookLevelRaw = (NumberString, NumberString, NumberString, NumberString);
105
106impl From<BookLevelRaw> for OrderBookLevel {
107 fn from(raw: BookLevelRaw) -> Self {
108 Self {
109 price: raw.0,
110 size: raw.1,
111 deprecated: raw.2,
112 order_count: raw.3,
113 }
114 }
115}
116
117#[derive(Debug, Clone, Deserialize)]
121#[serde(from = "CandleRaw")]
122#[non_exhaustive]
123pub struct Candle {
124 pub ts: NumberString,
126 pub open: NumberString,
128 pub high: NumberString,
130 pub low: NumberString,
132 pub close: NumberString,
134 pub vol: NumberString,
136 pub vol_ccy: NumberString,
138 pub vol_ccy_quote: NumberString,
140 pub confirm: NumberString,
142}
143
144type CandleRaw = (
145 NumberString,
146 NumberString,
147 NumberString,
148 NumberString,
149 NumberString,
150 NumberString,
151 NumberString,
152 NumberString,
153 NumberString,
154);
155
156impl From<CandleRaw> for Candle {
157 fn from(raw: CandleRaw) -> Self {
158 Self {
159 ts: raw.0,
160 open: raw.1,
161 high: raw.2,
162 low: raw.3,
163 close: raw.4,
164 vol: raw.5,
165 vol_ccy: raw.6,
166 vol_ccy_quote: raw.7,
167 confirm: raw.8,
168 }
169 }
170}
171
172#[derive(Debug, Clone, Deserialize)]
174#[serde(rename_all = "camelCase")]
175#[non_exhaustive]
176pub struct MarketTrade {
177 pub inst_id: String,
179 #[serde(default)]
181 pub trade_id: String,
182 #[serde(default)]
184 pub px: NumberString,
185 #[serde(default)]
187 pub sz: NumberString,
188 #[serde(default)]
190 pub side: String,
191 #[serde(default)]
193 pub ts: NumberString,
194}
195
196#[derive(Debug, Clone, Deserialize)]
201#[serde(rename_all = "camelCase")]
202#[non_exhaustive]
203pub struct BlockTicker {
204 #[serde(default)]
206 pub inst_type: String,
207 #[serde(default)]
209 pub inst_id: String,
210 #[serde(default)]
212 pub last: NumberString,
213 #[serde(default)]
215 pub last_sz: NumberString,
216 #[serde(default)]
218 pub ask_px: NumberString,
219 #[serde(default)]
221 pub ask_sz: NumberString,
222 #[serde(default)]
224 pub bid_px: NumberString,
225 #[serde(default)]
227 pub bid_sz: NumberString,
228 #[serde(default)]
230 pub open24h: NumberString,
231 #[serde(default)]
233 pub high24h: NumberString,
234 #[serde(default)]
236 pub low24h: NumberString,
237 #[serde(default)]
239 pub vol24h: NumberString,
240 #[serde(default)]
242 pub vol_ccy24h: NumberString,
243 #[serde(default)]
245 pub ts: NumberString,
246}
247
248pub type BlockTrade = MarketTrade;
250
251#[derive(Debug, Clone, Deserialize)]
253#[serde(rename_all = "camelCase")]
254#[non_exhaustive]
255pub struct OptionInstrumentFamilyTrade {
256 #[serde(default)]
258 pub inst_id: String,
259 #[serde(default)]
261 pub inst_family: String,
262 #[serde(default)]
264 pub trade_id: String,
265 #[serde(default)]
267 pub px: NumberString,
268 #[serde(default)]
270 pub sz: NumberString,
271 #[serde(default)]
273 pub side: String,
274 #[serde(default)]
276 pub ts: NumberString,
277}
278
279#[derive(Debug, Clone, Deserialize)]
281#[serde(rename_all = "camelCase")]
282#[non_exhaustive]
283pub struct PlatformVolume {
284 #[serde(default)]
286 pub vol_usd: NumberString,
287 #[serde(default)]
289 pub vol_cny: NumberString,
290}
291
292#[derive(Debug, Clone, Deserialize)]
294#[serde(rename_all = "camelCase")]
295#[non_exhaustive]
296pub struct IndexComponents {
297 #[serde(default)]
299 pub index: String,
300 #[serde(default)]
302 pub components: Vec<IndexComponent>,
303 #[serde(default)]
305 pub ts: NumberString,
306}
307
308#[derive(Debug, Clone, Deserialize)]
310#[serde(rename_all = "camelCase")]
311#[non_exhaustive]
312pub struct IndexComponent {
313 #[serde(default)]
315 pub exch: String,
316 #[serde(default)]
318 pub symbol: String,
319 #[serde(default)]
321 pub sym_px: NumberString,
322 #[serde(default)]
324 pub wgt: NumberString,
325 #[serde(default)]
327 pub cnv_px: NumberString,
328}
329
330#[derive(Debug, Clone, Deserialize)]
332#[serde(rename_all = "camelCase")]
333#[non_exhaustive]
334pub struct ExchangeRate {
335 #[serde(default)]
337 pub usd_cny: NumberString,
338}