rust_okx/api/public_data/responses/
edge.rs1use crate::model::{NumberString, deserialize_vec_or_empty_string};
2use serde::Deserialize;
3
4#[derive(Debug, Clone, Deserialize)]
6#[serde(rename_all = "camelCase")]
7#[non_exhaustive]
8pub struct OptionSummary {
9 #[serde(default)]
11 pub inst_type: String,
12 #[serde(default)]
14 pub inst_id: String,
15 #[serde(default)]
17 pub uly: String,
18 #[serde(default)]
20 pub inst_family: String,
21 #[serde(default)]
23 pub delta: NumberString,
24 #[serde(default)]
26 pub gamma: NumberString,
27 #[serde(default)]
29 pub vega: NumberString,
30 #[serde(default)]
32 pub theta: NumberString,
33 #[serde(default)]
35 pub delta_bs: NumberString,
36 #[serde(default)]
38 pub gamma_bs: NumberString,
39 #[serde(default)]
41 pub vega_bs: NumberString,
42 #[serde(default)]
44 pub theta_bs: NumberString,
45 #[serde(default)]
47 pub lever: NumberString,
48 #[serde(default)]
50 pub mark_vol: NumberString,
51 #[serde(default)]
53 pub real_vol: NumberString,
54 #[serde(default)]
56 pub vol_lv: NumberString,
57 #[serde(default)]
59 pub bid_vol: NumberString,
60 #[serde(default)]
62 pub ask_vol: NumberString,
63 #[serde(default)]
65 pub fwd_px: NumberString,
66 #[serde(default)]
68 pub ts: NumberString,
69}
70
71#[derive(Debug, Clone, Deserialize)]
73#[serde(rename_all = "camelCase")]
74#[non_exhaustive]
75pub struct EstimatedPrice {
76 #[serde(default)]
78 pub inst_type: String,
79 #[serde(default)]
81 pub inst_id: String,
82 #[serde(default)]
84 pub settle_px: NumberString,
85 #[serde(default)]
87 pub ts: NumberString,
88}
89
90#[derive(Debug, Clone, Deserialize)]
92#[serde(rename_all = "camelCase")]
93#[non_exhaustive]
94pub struct DiscountLevel {
95 #[serde(default)]
97 pub discount_rate: NumberString,
98 #[serde(default)]
100 pub min_amt: NumberString,
101 #[serde(default)]
103 pub max_amt: NumberString,
104}
105
106#[derive(Debug, Clone, Deserialize)]
108#[serde(rename_all = "camelCase")]
109#[non_exhaustive]
110pub struct DiscountDetail {
111 #[serde(default)]
113 pub discount_rate: NumberString,
114 #[serde(default)]
116 pub liq_penalty_rate: NumberString,
117 #[serde(default)]
119 pub min_amt: NumberString,
120 #[serde(default)]
122 pub max_amt: NumberString,
123 #[serde(default)]
125 pub tier: String,
126 #[serde(default)]
128 pub dis_ccy_eq: NumberString,
129}
130
131#[derive(Debug, Clone, Deserialize)]
133#[serde(rename_all = "camelCase")]
134#[non_exhaustive]
135pub struct DiscountRateInterestFreeQuota {
136 #[serde(default)]
138 pub ccy: String,
139 #[serde(default)]
141 pub amt: NumberString,
142 #[serde(default)]
144 pub discount_lv: String,
145 #[serde(default)]
147 pub details: Vec<DiscountDetail>,
148 #[serde(default)]
150 pub collateral_restrict: bool,
151 #[serde(default)]
153 pub min_discount_rate: NumberString,
154}
155
156#[derive(Debug, Clone, Deserialize)]
158#[serde(rename_all = "camelCase")]
159#[non_exhaustive]
160pub struct LoanQuotaBasic {
161 #[serde(default)]
163 pub ccy: String,
164 #[serde(default)]
166 pub rate: NumberString,
167 #[serde(default)]
169 pub quota: NumberString,
170}
171
172#[derive(Debug, Clone, Deserialize)]
174#[serde(rename_all = "camelCase")]
175#[non_exhaustive]
176pub struct LoanQuotaLevel {
177 #[serde(default)]
179 pub level: String,
180 #[serde(default)]
182 pub loan_quota_coef: NumberString,
183 #[serde(default)]
185 pub ir_discount: NumberString,
186}
187
188#[derive(Debug, Clone, Deserialize)]
190#[serde(rename_all = "camelCase")]
191#[non_exhaustive]
192pub struct LoanQuotaConfiguredCurrency {
193 #[serde(default)]
195 pub ccy: String,
196 #[serde(default)]
198 pub rate: NumberString,
199}
200
201#[derive(Debug, Clone, Deserialize)]
203#[serde(rename_all = "camelCase")]
204#[non_exhaustive]
205pub struct LoanQuotaConfig {
206 #[serde(default)]
208 pub ccy: String,
209 #[serde(default)]
211 pub stgy_type: String,
212 #[serde(default)]
214 pub quota: NumberString,
215 #[serde(default)]
217 pub level: String,
218}
219
220#[derive(Debug, Clone, Deserialize)]
222#[serde(rename_all = "camelCase")]
223#[non_exhaustive]
224pub struct InterestRateLoanQuota {
225 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
227 pub basic: Vec<LoanQuotaBasic>,
228 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
230 pub vip: Vec<LoanQuotaLevel>,
231 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
233 pub regular: Vec<LoanQuotaLevel>,
234 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
236 pub config_ccy_list: Vec<LoanQuotaConfiguredCurrency>,
237 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
239 pub config: Vec<LoanQuotaConfig>,
240}
241
242#[derive(Debug, Clone, Deserialize)]
244#[serde(rename_all = "camelCase")]
245#[non_exhaustive]
246pub struct VipInterestRateLoanQuota {
247 #[serde(default)]
249 pub ccy: String,
250 #[serde(default)]
252 pub level: String,
253 #[serde(default)]
255 pub rate: NumberString,
256 #[serde(default)]
258 pub quota: NumberString,
259}
260
261#[derive(Debug, Clone, Deserialize)]
263#[serde(rename_all = "camelCase")]
264#[non_exhaustive]
265pub struct TickBandDetail {
266 #[serde(default)]
268 pub min_px: NumberString,
269 #[serde(default)]
271 pub max_px: NumberString,
272 #[serde(default)]
274 pub tick_sz: NumberString,
275}
276
277#[derive(Debug, Clone, Deserialize)]
279#[serde(rename_all = "camelCase")]
280#[non_exhaustive]
281pub struct InstrumentTickBand {
282 #[serde(default)]
284 pub inst_type: String,
285 #[serde(default)]
287 pub inst_family: String,
288 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
290 pub tick_band: Vec<TickBandDetail>,
291 #[serde(default)]
293 pub ts: NumberString,
294}
295
296#[derive(Debug, Clone, Deserialize)]
298#[serde(rename_all = "camelCase")]
299#[non_exhaustive]
300pub struct PublicOptionTrade {
301 #[serde(default)]
303 pub inst_id: String,
304 #[serde(default)]
306 pub trade_id: String,
307 #[serde(default)]
309 pub px: NumberString,
310 #[serde(default)]
312 pub sz: NumberString,
313 #[serde(default)]
315 pub side: String,
316 #[serde(default)]
318 pub fill_vol: NumberString,
319 #[serde(default)]
321 pub fwd_px: NumberString,
322 #[serde(default)]
324 pub idx_px: NumberString,
325 #[serde(default)]
327 pub mark_px: NumberString,
328 #[serde(default)]
330 pub ts: NumberString,
331}
332
333#[derive(Debug, Clone, Deserialize)]
335#[serde(rename_all = "camelCase")]
336#[non_exhaustive]
337pub struct MarketDataHistory {
338 #[serde(default)]
340 pub module: String,
341 #[serde(default)]
343 pub inst_type: String,
344 #[serde(default)]
346 pub inst_id: String,
347 #[serde(default)]
349 pub date_aggr_type: String,
350 #[serde(default)]
352 pub value: NumberString,
353 #[serde(default)]
355 pub ts: NumberString,
356}
357
358#[derive(Debug, Clone, Deserialize)]
360#[serde(rename_all = "camelCase")]
361#[non_exhaustive]
362pub struct MmInstrumentType {
363 #[serde(default)]
365 pub inst_id: String,
366 #[serde(default)]
368 pub inst_type: String,
369 #[serde(default)]
371 pub pair_type: String,
372}
373
374#[derive(Debug, Clone, Deserialize)]
376#[serde(rename_all = "camelCase")]
377#[non_exhaustive]
378pub struct EconomicCalendar {
379 #[serde(default)]
381 pub calendar_id: String,
382 #[serde(default)]
384 pub date: NumberString,
385 #[serde(default)]
387 pub region: String,
388 #[serde(default)]
390 pub category: String,
391 #[serde(default)]
393 pub event: String,
394 #[serde(default)]
396 pub ref_date: NumberString,
397 #[serde(default)]
399 pub actual: String,
400 #[serde(default)]
402 pub previous: String,
403 #[serde(default)]
405 pub forecast: String,
406 #[serde(default)]
408 pub date_span: String,
409 #[serde(default)]
411 pub importance: String,
412 #[serde(default)]
414 pub u_time: NumberString,
415 #[serde(default)]
417 pub prev_initial: String,
418 #[serde(default)]
420 pub ccy: String,
421 #[serde(default)]
423 pub unit: String,
424}
425
426#[cfg(test)]
427mod tests {
428 use super::*;
429
430 #[test]
431 fn option_summary_ignores_future_fields() {
432 let row: OptionSummary = serde_json::from_str(
433 r#"{"instType":"OPTION","instId":"BTC-USD-1-C","delta":"0.5","futureField":"ok"}"#,
434 )
435 .unwrap();
436 assert_eq!(row.inst_type, "OPTION");
437 assert_eq!(row.inst_id, "BTC-USD-1-C");
438 }
439}