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 DiscountRateInterestFreeQuota {
111 #[serde(default)]
113 pub ccy: String,
114 #[serde(default)]
116 pub amt: NumberString,
117 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
119 pub discount_lv: Vec<DiscountLevel>,
120}
121
122#[derive(Debug, Clone, Deserialize)]
124#[serde(rename_all = "camelCase")]
125#[non_exhaustive]
126pub struct LoanQuotaBasic {
127 #[serde(default)]
129 pub ccy: String,
130 #[serde(default)]
132 pub rate: NumberString,
133 #[serde(default)]
135 pub quota: NumberString,
136}
137
138#[derive(Debug, Clone, Deserialize)]
140#[serde(rename_all = "camelCase")]
141#[non_exhaustive]
142pub struct LoanQuotaLevel {
143 #[serde(default)]
145 pub level: String,
146 #[serde(default)]
148 pub loan_quota_coef: NumberString,
149 #[serde(default)]
151 pub ir_discount: NumberString,
152}
153
154#[derive(Debug, Clone, Deserialize)]
156#[serde(rename_all = "camelCase")]
157#[non_exhaustive]
158pub struct LoanQuotaConfiguredCurrency {
159 #[serde(default)]
161 pub ccy: String,
162 #[serde(default)]
164 pub rate: NumberString,
165}
166
167#[derive(Debug, Clone, Deserialize)]
169#[serde(rename_all = "camelCase")]
170#[non_exhaustive]
171pub struct LoanQuotaConfig {
172 #[serde(default)]
174 pub ccy: String,
175 #[serde(default)]
177 pub stgy_type: String,
178 #[serde(default)]
180 pub quota: NumberString,
181 #[serde(default)]
183 pub level: String,
184}
185
186#[derive(Debug, Clone, Deserialize)]
188#[serde(rename_all = "camelCase")]
189#[non_exhaustive]
190pub struct InterestRateLoanQuota {
191 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
193 pub basic: Vec<LoanQuotaBasic>,
194 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
196 pub vip: Vec<LoanQuotaLevel>,
197 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
199 pub regular: Vec<LoanQuotaLevel>,
200 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
202 pub config_ccy_list: Vec<LoanQuotaConfiguredCurrency>,
203 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
205 pub config: Vec<LoanQuotaConfig>,
206}
207
208#[derive(Debug, Clone, Deserialize)]
210#[serde(rename_all = "camelCase")]
211#[non_exhaustive]
212pub struct VipInterestRateLoanQuota {
213 #[serde(default)]
215 pub ccy: String,
216 #[serde(default)]
218 pub level: String,
219 #[serde(default)]
221 pub rate: NumberString,
222 #[serde(default)]
224 pub quota: NumberString,
225}
226
227#[derive(Debug, Clone, Deserialize)]
229#[serde(rename_all = "camelCase")]
230#[non_exhaustive]
231pub struct TickBandDetail {
232 #[serde(default)]
234 pub min_px: NumberString,
235 #[serde(default)]
237 pub max_px: NumberString,
238 #[serde(default)]
240 pub tick_sz: NumberString,
241}
242
243#[derive(Debug, Clone, Deserialize)]
245#[serde(rename_all = "camelCase")]
246#[non_exhaustive]
247pub struct InstrumentTickBand {
248 #[serde(default)]
250 pub inst_type: String,
251 #[serde(default)]
253 pub inst_family: String,
254 #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
256 pub tick_band: Vec<TickBandDetail>,
257 #[serde(default)]
259 pub ts: NumberString,
260}
261
262#[derive(Debug, Clone, Deserialize)]
264#[serde(rename_all = "camelCase")]
265#[non_exhaustive]
266pub struct PublicOptionTrade {
267 #[serde(default)]
269 pub inst_id: String,
270 #[serde(default)]
272 pub trade_id: String,
273 #[serde(default)]
275 pub px: NumberString,
276 #[serde(default)]
278 pub sz: NumberString,
279 #[serde(default)]
281 pub side: String,
282 #[serde(default)]
284 pub fill_vol: NumberString,
285 #[serde(default)]
287 pub fwd_px: NumberString,
288 #[serde(default)]
290 pub idx_px: NumberString,
291 #[serde(default)]
293 pub mark_px: NumberString,
294 #[serde(default)]
296 pub ts: NumberString,
297}
298
299#[derive(Debug, Clone, Deserialize)]
301#[serde(rename_all = "camelCase")]
302#[non_exhaustive]
303pub struct MarketDataHistory {
304 #[serde(default)]
306 pub module: String,
307 #[serde(default)]
309 pub inst_type: String,
310 #[serde(default)]
312 pub inst_id: String,
313 #[serde(default)]
315 pub date_aggr_type: String,
316 #[serde(default)]
318 pub value: NumberString,
319 #[serde(default)]
321 pub ts: NumberString,
322}
323
324#[cfg(test)]
325mod tests {
326 use super::*;
327
328 #[test]
329 fn option_summary_ignores_future_fields() {
330 let row: OptionSummary = serde_json::from_str(
331 r#"{"instType":"OPTION","instId":"BTC-USD-1-C","delta":"0.5","futureField":"ok"}"#,
332 )
333 .unwrap();
334 assert_eq!(row.inst_type, "OPTION");
335 assert_eq!(row.inst_id, "BTC-USD-1-C");
336 }
337}