1use serde::{Deserialize, Deserializer, Serialize};
6use serde_json::Value;
7
8fn deserialize_nullable_string<'de, D>(deserializer: D) -> Result<String, D::Error>
10where
11 D: Deserializer<'de>,
12{
13 let opt: Option<String> = Option::deserialize(deserializer)?;
14 Ok(opt.unwrap_or_default())
15}
16
17#[derive(Debug, Clone, Deserialize)]
23pub struct ApiResponse {
24 pub code: i32,
26 #[serde(alias = "message", default)]
28 pub msg: String,
29 #[serde(default)]
31 pub data: Value,
32}
33
34#[derive(Debug, Clone, Deserialize)]
36#[serde(rename_all = "camelCase")]
37pub struct TokenResponse {
38 pub token_type: String,
40 #[serde(rename = "token")]
42 pub access_token: String,
43 pub expires_in: i32,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct Article {
55 #[serde(default, deserialize_with = "deserialize_nullable_string")]
57 pub id: String,
58 #[serde(default, deserialize_with = "deserialize_nullable_string")]
60 pub title: String,
61 #[serde(default, deserialize_with = "deserialize_nullable_string")]
63 pub sub_title: String,
64 #[serde(
66 rename = "infoSummary",
67 default,
68 deserialize_with = "deserialize_nullable_string"
69 )]
70 pub summary: String,
71 #[serde(default, deserialize_with = "deserialize_nullable_string")]
73 pub show_date: String,
74 #[serde(default, deserialize_with = "deserialize_nullable_string")]
76 pub create_date: String,
77 #[serde(default, deserialize_with = "deserialize_nullable_string")]
79 pub content: String,
80 #[serde(default, deserialize_with = "deserialize_nullable_string")]
82 pub keywords: String,
83 #[serde(default, deserialize_with = "deserialize_nullable_string")]
85 pub page_name: String,
86}
87
88pub type ArticleDetail = Article;
90
91#[derive(Debug, Clone, Serialize)]
93#[serde(rename_all = "camelCase")]
94pub struct GetArticleByPageRequest {
95 pub column_id: String,
97 pub page_no: i32,
99 pub page_size: i32,
101 pub site_id: i32,
103}
104
105#[derive(Debug, Clone, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct GetArticleByPageResponse {
109 pub column_id: String,
111 pub total_count: i32,
113 pub result_list: Vec<Article>,
115}
116
117#[derive(Debug, Clone, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct TradeDate {
125 #[serde(
127 rename = "tradeDate",
128 default,
129 deserialize_with = "deserialize_nullable_string"
130 )]
131 pub date: String,
132}
133
134#[derive(Debug, Clone, Deserialize)]
136#[serde(rename_all = "camelCase")]
137pub struct Variety {
138 #[serde(
140 rename = "varietyId",
141 default,
142 deserialize_with = "deserialize_nullable_string"
143 )]
144 pub code: String,
145 #[serde(
147 rename = "varietyName",
148 default,
149 deserialize_with = "deserialize_nullable_string"
150 )]
151 pub name: String,
152 #[serde(
154 rename = "varietyEnglishName",
155 default,
156 deserialize_with = "deserialize_nullable_string"
157 )]
158 pub english_name: String,
159 #[serde(default, deserialize_with = "deserialize_nullable_string")]
161 pub pic: String,
162 #[serde(
164 rename = "varietyType",
165 default,
166 deserialize_with = "deserialize_nullable_string"
167 )]
168 pub variety_type: String,
169}
170
171#[derive(Debug, Clone, Deserialize)]
177#[serde(rename_all = "camelCase")]
178pub struct Quote {
179 #[serde(default, deserialize_with = "deserialize_nullable_string")]
181 pub variety: String,
182 #[serde(
184 rename = "contractId",
185 default,
186 deserialize_with = "deserialize_nullable_string"
187 )]
188 pub contract_id: String,
189 #[serde(
191 rename = "delivMonth",
192 default,
193 deserialize_with = "deserialize_nullable_string"
194 )]
195 pub deliv_month: String,
196 #[serde(default, deserialize_with = "deserialize_nullable_string")]
198 pub open: String,
199 #[serde(default, deserialize_with = "deserialize_nullable_string")]
201 pub high: String,
202 #[serde(default, deserialize_with = "deserialize_nullable_string")]
204 pub low: String,
205 #[serde(default, deserialize_with = "deserialize_nullable_string")]
207 pub close: String,
208 #[serde(
210 rename = "lastClear",
211 default,
212 deserialize_with = "deserialize_nullable_string"
213 )]
214 pub last_clear: String,
215 #[serde(
217 rename = "lastPrice",
218 default,
219 deserialize_with = "deserialize_nullable_string"
220 )]
221 pub last_price: String,
222 #[serde(
224 rename = "clearPrice",
225 default,
226 deserialize_with = "deserialize_nullable_string"
227 )]
228 pub clear_price: String,
229 #[serde(default, deserialize_with = "deserialize_nullable_string")]
231 pub diff: String,
232 #[serde(default, deserialize_with = "deserialize_nullable_string")]
234 pub diff1: String,
235 #[serde(rename = "volumn", default)]
237 pub volume: i64,
238 #[serde(rename = "openInterest", default)]
240 pub open_interest: i64,
241 #[serde(rename = "diffI", default)]
243 pub diff_i: i64,
244 #[serde(default, deserialize_with = "deserialize_nullable_string")]
246 pub turnover: String,
247}
248
249#[derive(Debug, Clone, Serialize)]
251#[serde(rename_all = "camelCase")]
252pub struct QuotesRequest {
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub variety_id: Option<String>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub variety: Option<String>,
259 pub trade_date: String,
261 pub trade_type: String,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub lang: Option<String>,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub statistics_type: Option<i32>,
269}
270
271#[derive(Debug, Clone, Serialize)]
273#[serde(rename_all = "camelCase")]
274pub struct WeekQuotesRequest {
275 pub variety_code: String,
277 pub year: i32,
279 pub week: i32,
281}
282
283#[derive(Debug, Clone, Serialize)]
285#[serde(rename_all = "camelCase")]
286pub struct MonthQuotesRequest {
287 pub variety_code: String,
289 pub year: i32,
291 pub month: i32,
293}
294
295#[derive(Debug, Clone, Serialize)]
297#[serde(rename_all = "camelCase")]
298pub struct ContractStatRequest {
299 pub contract_code: String,
301 pub start_date: String,
303 pub end_date: String,
305}
306
307#[derive(Debug, Clone, Deserialize)]
309#[serde(rename_all = "camelCase")]
310pub struct ContractStat {
311 pub contract_code: String,
313 pub total_volume: i64,
315 pub avg_price: f64,
317}
318
319#[derive(Debug, Clone, Deserialize)]
325#[serde(rename_all = "camelCase")]
326pub struct DeliveryData {
327 #[serde(default, deserialize_with = "deserialize_nullable_string")]
329 pub variety_code: String,
330 #[serde(default, deserialize_with = "deserialize_nullable_string")]
332 pub delivery_month: String,
333 pub delivery_volume: i64,
335 pub delivery_amount: f64,
337}
338
339#[derive(Debug, Clone, Serialize)]
341#[serde(rename_all = "camelCase")]
342pub struct DeliveryDataRequest {
343 pub variety_code: String,
345 pub trade_date: String,
347}
348
349#[derive(Debug, Clone, Deserialize)]
351#[serde(rename_all = "camelCase")]
352pub struct DeliveryMatch {
353 #[serde(default, deserialize_with = "deserialize_nullable_string")]
355 pub variety_code: String,
356 #[serde(default, deserialize_with = "deserialize_nullable_string")]
358 pub buy_member: String,
359 #[serde(default, deserialize_with = "deserialize_nullable_string")]
361 pub sell_member: String,
362 pub volume: i64,
364}
365
366#[derive(Debug, Clone, Serialize)]
368#[serde(rename_all = "camelCase")]
369pub struct DeliveryMatchRequest {
370 pub variety_code: String,
372 pub trade_date: String,
374}
375
376#[derive(Debug, Clone, Deserialize)]
378#[serde(rename_all = "camelCase")]
379pub struct WarehouseReceipt {
380 #[serde(default, deserialize_with = "deserialize_nullable_string")]
382 pub variety_code: String,
383 #[serde(default, deserialize_with = "deserialize_nullable_string")]
385 pub warehouse_name: String,
386 pub quantity: i64,
388 #[serde(default, deserialize_with = "deserialize_nullable_string")]
390 pub trade_date: String,
391}
392
393#[derive(Debug, Clone, Serialize)]
395#[serde(rename_all = "camelCase")]
396pub struct WarehouseReceiptRequest {
397 pub variety_code: String,
399 pub trade_date: String,
401}
402
403#[derive(Debug, Clone, Deserialize)]
405#[serde(rename_all = "camelCase")]
406pub struct DeliveryCost {
407 #[serde(default, deserialize_with = "deserialize_nullable_string")]
409 pub variety_code: String,
410 pub delivery_fee: f64,
412 pub inspection_fee: f64,
414 pub storage_fee: f64,
416}
417
418#[derive(Debug, Clone, Deserialize)]
420#[serde(rename_all = "camelCase")]
421pub struct WarehousePremium {
422 #[serde(default, deserialize_with = "deserialize_nullable_string")]
424 pub variety_code: String,
425 #[serde(default, deserialize_with = "deserialize_nullable_string")]
427 pub warehouse_name: String,
428 pub premium: f64,
430}
431
432#[derive(Debug, Clone, Deserialize)]
438#[serde(rename_all = "camelCase")]
439pub struct Ranking {
440 #[serde(default, deserialize_with = "deserialize_nullable_string")]
442 pub rank: String,
443 #[serde(
445 rename = "qtyAbbr",
446 default,
447 deserialize_with = "deserialize_nullable_string"
448 )]
449 pub qty_abbr: String,
450 #[serde(rename = "todayQty", default)]
452 pub today_qty: i64,
453 #[serde(rename = "qtySub", default)]
455 pub qty_sub: i64,
456 #[serde(
458 rename = "buyAbbr",
459 default,
460 deserialize_with = "deserialize_nullable_string"
461 )]
462 pub buy_abbr: String,
463 #[serde(rename = "todayBuyQty", default)]
465 pub today_buy_qty: i64,
466 #[serde(rename = "buySub", default)]
468 pub buy_sub: i64,
469 #[serde(
471 rename = "sellAbbr",
472 default,
473 deserialize_with = "deserialize_nullable_string"
474 )]
475 pub sell_abbr: String,
476 #[serde(rename = "todaySellQty", default)]
478 pub today_sell_qty: i64,
479 #[serde(rename = "sellSub", default)]
481 pub sell_sub: i64,
482}
483
484#[derive(Debug, Clone, Serialize)]
486#[serde(rename_all = "camelCase")]
487pub struct DailyRankingRequest {
488 pub variety_id: String,
490 pub contract_id: String,
492 pub trade_date: String,
494 pub trade_type: String,
496}
497
498#[derive(Debug, Clone, Deserialize)]
500#[serde(rename_all = "camelCase")]
501pub struct DailyRankingResponse {
502 #[serde(
504 rename = "contractId",
505 default,
506 deserialize_with = "deserialize_nullable_string"
507 )]
508 pub contract_id: String,
509 #[serde(rename = "todayQty", default)]
511 pub today_qty: i64,
512 #[serde(rename = "qtySub", default)]
514 pub qty_sub: i64,
515 #[serde(rename = "todayBuyQty", default)]
517 pub today_buy_qty: i64,
518 #[serde(rename = "buySub", default)]
520 pub buy_sub: i64,
521 #[serde(rename = "todaySellQty", default)]
523 pub today_sell_qty: i64,
524 #[serde(rename = "sellSub", default)]
526 pub sell_sub: i64,
527 #[serde(rename = "qtyFutureList", default)]
529 pub qty_future_list: Vec<Ranking>,
530 #[serde(rename = "buyFutureList", default)]
532 pub buy_future_list: Vec<Ranking>,
533 #[serde(rename = "sellFutureList", default)]
535 pub sell_future_list: Vec<Ranking>,
536}
537
538#[derive(Debug, Clone, Serialize)]
540#[serde(rename_all = "camelCase")]
541pub struct PhaseRankingRequest {
542 pub variety: String,
544 pub start_month: String,
546 pub end_month: String,
548 pub trade_type: String,
550}
551
552#[derive(Debug, Clone, Deserialize)]
554#[serde(rename_all = "camelCase")]
555pub struct PhaseRanking {
556 #[serde(default, deserialize_with = "deserialize_nullable_string")]
558 pub seq: String,
559 #[serde(
561 rename = "memberId",
562 default,
563 deserialize_with = "deserialize_nullable_string"
564 )]
565 pub member_id: String,
566 #[serde(
568 rename = "memberName",
569 default,
570 deserialize_with = "deserialize_nullable_string"
571 )]
572 pub member_name: String,
573 #[serde(rename = "monthQty", default)]
575 pub month_qty: f64,
576 #[serde(rename = "qtyRatio", default)]
578 pub qty_ratio: f64,
579 #[serde(rename = "monthAmt", default)]
581 pub month_amt: f64,
582 #[serde(rename = "amtRatio", default)]
584 pub amt_ratio: f64,
585}
586
587#[derive(Debug, Clone, Deserialize)]
593#[serde(rename_all = "camelCase")]
594pub struct TradeParam {
595 #[serde(
597 rename = "contractId",
598 default,
599 deserialize_with = "deserialize_nullable_string"
600 )]
601 pub contract_id: String,
602 #[serde(rename = "specBuyRate", default)]
604 pub spec_buy_rate: f64,
605 #[serde(rename = "specBuy", default)]
607 pub spec_buy: f64,
608 #[serde(rename = "hedgeBuyRate", default)]
610 pub hedge_buy_rate: f64,
611 #[serde(rename = "hedgeBuy", default)]
613 pub hedge_buy: f64,
614 #[serde(rename = "riseLimitRate", default)]
616 pub rise_limit_rate: f64,
617 #[serde(rename = "riseLimit", default)]
619 pub rise_limit: f64,
620 #[serde(rename = "fallLimit", default)]
622 pub fall_limit: f64,
623 #[serde(
625 rename = "tradeDate",
626 default,
627 deserialize_with = "deserialize_nullable_string"
628 )]
629 pub trade_date: String,
630}
631
632#[derive(Debug, Clone, Serialize)]
634#[serde(rename_all = "camelCase")]
635pub struct DayTradeParamRequest {
636 pub variety_id: String,
638 pub trade_type: String,
640 pub lang: String,
642}
643
644#[derive(Debug, Clone, Deserialize)]
646#[serde(rename_all = "camelCase")]
647pub struct ContractInfo {
648 #[serde(
650 rename = "contractId",
651 default,
652 deserialize_with = "deserialize_nullable_string"
653 )]
654 pub contract_id: String,
655 #[serde(default, deserialize_with = "deserialize_nullable_string")]
657 pub variety: String,
658 #[serde(
660 rename = "varietyOrder",
661 default,
662 deserialize_with = "deserialize_nullable_string"
663 )]
664 pub variety_order: String,
665 #[serde(default)]
667 pub unit: i32,
668 #[serde(default, deserialize_with = "deserialize_nullable_string")]
670 pub tick: String,
671 #[serde(
673 rename = "startTradeDate",
674 default,
675 deserialize_with = "deserialize_nullable_string"
676 )]
677 pub start_trade_date: String,
678 #[serde(
680 rename = "endTradeDate",
681 default,
682 deserialize_with = "deserialize_nullable_string"
683 )]
684 pub end_trade_date: String,
685 #[serde(
687 rename = "endDeliveryDate",
688 default,
689 deserialize_with = "deserialize_nullable_string"
690 )]
691 pub end_delivery_date: String,
692 #[serde(
694 rename = "tradeType",
695 default,
696 deserialize_with = "deserialize_nullable_string"
697 )]
698 pub trade_type: String,
699}
700
701#[derive(Debug, Clone, Serialize)]
703#[serde(rename_all = "camelCase")]
704pub struct ContractInfoRequest {
705 pub variety_id: String,
707 pub trade_type: String,
709 pub lang: String,
711}
712
713#[derive(Debug, Clone, Deserialize)]
715#[serde(rename_all = "camelCase")]
716pub struct ArbitrageContract {
717 #[serde(
719 rename = "arbiName",
720 default,
721 deserialize_with = "deserialize_nullable_string"
722 )]
723 pub arbi_name: String,
724 #[serde(
726 rename = "varietyName",
727 default,
728 deserialize_with = "deserialize_nullable_string"
729 )]
730 pub variety_name: String,
731 #[serde(
733 rename = "arbiContractId",
734 default,
735 deserialize_with = "deserialize_nullable_string"
736 )]
737 pub arbi_contract_id: String,
738 #[serde(rename = "maxHand", default)]
740 pub max_hand: i32,
741 #[serde(default)]
743 pub tick: f64,
744}
745
746#[derive(Debug, Clone, Serialize)]
748#[serde(rename_all = "camelCase")]
749pub struct ArbitrageContractRequest {
750 pub lang: String,
752}
753
754#[derive(Debug, Clone, Deserialize)]
760#[serde(rename_all = "camelCase")]
761pub struct SettleParam {
762 #[serde(default, deserialize_with = "deserialize_nullable_string")]
764 pub variety: String,
765 #[serde(
767 rename = "varietyOrder",
768 default,
769 deserialize_with = "deserialize_nullable_string"
770 )]
771 pub variety_order: String,
772 #[serde(
774 rename = "contractId",
775 default,
776 deserialize_with = "deserialize_nullable_string"
777 )]
778 pub contract_id: String,
779 #[serde(
781 rename = "clearPrice",
782 default,
783 deserialize_with = "deserialize_nullable_string"
784 )]
785 pub clear_price: String,
786 #[serde(
788 rename = "openFee",
789 default,
790 deserialize_with = "deserialize_nullable_string"
791 )]
792 pub open_fee: String,
793 #[serde(
795 rename = "offsetFee",
796 default,
797 deserialize_with = "deserialize_nullable_string"
798 )]
799 pub offset_fee: String,
800 #[serde(
802 rename = "shortOpenFee",
803 default,
804 deserialize_with = "deserialize_nullable_string"
805 )]
806 pub short_open_fee: String,
807 #[serde(
809 rename = "shortOffsetFee",
810 default,
811 deserialize_with = "deserialize_nullable_string"
812 )]
813 pub short_offset_fee: String,
814 #[serde(default, deserialize_with = "deserialize_nullable_string")]
816 pub style: String,
817 #[serde(
819 rename = "specBuyRate",
820 default,
821 deserialize_with = "deserialize_nullable_string"
822 )]
823 pub spec_buy_rate: String,
824 #[serde(
826 rename = "specSellRate",
827 default,
828 deserialize_with = "deserialize_nullable_string"
829 )]
830 pub spec_sell_rate: String,
831 #[serde(
833 rename = "hedgeBuyRate",
834 default,
835 deserialize_with = "deserialize_nullable_string"
836 )]
837 pub hedge_buy_rate: String,
838 #[serde(
840 rename = "hedgeSellRate",
841 default,
842 deserialize_with = "deserialize_nullable_string"
843 )]
844 pub hedge_sell_rate: String,
845}
846
847#[derive(Debug, Clone, Serialize)]
849#[serde(rename_all = "camelCase")]
850pub struct SettleParamRequest {
851 pub variety_id: String,
853 pub trade_date: String,
855 pub trade_type: String,
857 pub lang: String,
859}