1use std::ffi::c_char;
2use std::mem::size_of;
3use std::sync::Arc;
4
5use serde::{Deserialize, Serialize};
6use serde_json::{json, Value};
7
8use crate::utils::{parse_number, parse_ratio, parse_ratio_str, parse_string};
9use crate::{error::*, models::*};
10use qvopenapi_bindings::{Tc8201InBlock, Tc8201OutBlock, Tc8201OutBlock1};
11
12pub const TR_CODE_C8201: &str = "c8201";
13
14#[derive(Debug, Clone, Deserialize)]
15pub struct C8201Request {
16 pub account_index: i32,
17 pub balance_type: char,
18}
19
20impl C8201Request {
21 pub fn new(account_index: i32, balance_type: char) -> C8201Request {
22 C8201Request {
23 account_index,
24 balance_type,
25 }
26 }
27
28 pub fn into_raw(&self) -> Arc<RawQueryRequest<Tc8201InBlock>> {
29 Arc::new(RawQueryRequest::new(
30 TR_CODE_C8201,
31 self.account_index,
32 Box::new(Tc8201InBlock {
33 pswd_noz44: [' ' as c_char; 44],
34 _pswd_noz44: ' ' as c_char,
35 bnc_bse_cdz1: [self.balance_type as c_char],
36 _bnc_bse_cdz1: ' ' as c_char,
37 }),
38 ))
39 }
40}
41
42pub fn parse_c8201_response(
43 block_data: *const c_char,
44 _block_len: i32,
45) -> Result<Value, QvOpenApiError> {
46 unsafe {
47 let res = &(*(block_data as *const Tc8201OutBlock));
48 Ok(json!(C8201Response {
49 dpsit_amtz16: parse_number(&res.dpsit_amtz16)?,
50 mrgn_amtz16: parse_number(&res.dpsit_amtz16)?,
51 mgint_npaid_amtz16: parse_number(&res.mgint_npaid_amtz16)?,
52 chgm_pos_amtz16: parse_number(&res.chgm_pos_amtz16)?,
53 cash_mrgn_amtz16: parse_number(&res.cash_mrgn_amtz16)?,
54 subst_mgamt_amtz16: parse_number(&res.subst_mgamt_amtz16)?,
55 coltr_ratez6: parse_string(&res.coltr_ratez6)?,
56 rcble_amtz16: parse_number(&res.rcble_amtz16)?,
57 order_pos_csamtz16: parse_number(&res.order_pos_csamtz16)?,
58 ecn_pos_csamtz16: parse_number(&res.ecn_pos_csamtz16)?,
59 nordm_loan_amtz16: parse_number(&res.nordm_loan_amtz16)?,
60 etc_lend_amtz16: parse_number(&res.etc_lend_amtz16)?,
61 subst_amtz16: parse_number(&res.subst_amtz16)?,
62 sln_sale_amtz16: parse_number(&res.sln_sale_amtz16)?,
63 bal_buy_ttamtz16: parse_number(&res.bal_buy_ttamtz16)?,
64 bal_ass_ttamtz16: parse_number(&res.bal_ass_ttamtz16)?,
65 asset_tot_amtz16: parse_number(&res.asset_tot_amtz16)?,
66 actvt_type10: parse_string(&res.actvt_type10)?,
67 lend_amtz16: parse_number(&res.lend_amtz16)?,
68 accnt_mgamt_ratez6: parse_string(&res.accnt_mgamt_ratez6)?,
69 sl_mrgn_amtz16: parse_number(&res.sl_mrgn_amtz16)?,
70 pos_csamt1z16: parse_number(&res.pos_csamt1z16)?,
71 pos_csamt2z16: parse_number(&res.pos_csamt2z16)?,
72 pos_csamt3z16: parse_number(&res.pos_csamt3z16)?,
73 pos_csamt4z16: parse_number(&res.pos_csamt4z16)?,
74 dpsit_amtz_d1_16: parse_number(&res.dpsit_amtz_d1_16)?,
75 dpsit_amtz_d2_16: parse_number(&res.dpsit_amtz_d2_16)?,
76 noticez30: parse_string(&res.noticez30)?,
77 tot_eal_plsz18: parse_string(&res.tot_eal_plsz18)?,
78 pft_rtz15: parse_ratio(&res.pft_rtz15)?,
79 }))
80 }
81}
82
83pub fn parse_c8201_response1_array(
84 block_data: *const c_char,
85 block_len: i32,
86) -> Result<Value, QvOpenApiError> {
87 unsafe {
88 let block_count = block_len as usize / size_of::<Tc8201OutBlock1>();
89 let res: &[Tc8201OutBlock1] =
90 core::slice::from_raw_parts(block_data as *const Tc8201OutBlock1, block_count);
91
92 let ret: Result<Vec<C8201Response1>, QvOpenApiError> =
93 res.iter().map(parse_c8201_response1).collect();
94 Ok(json!(ret?))
95 }
96}
97
98fn parse_c8201_response1(res: &Tc8201OutBlock1) -> Result<C8201Response1, QvOpenApiError> {
99 Ok(C8201Response1 {
100 issue_codez6: parse_string(&res.issue_codez6)?,
101 issue_namez40: parse_string(&res.issue_namez40)?,
102 bal_typez6: parse_string(&res.bal_typez6)?,
103 loan_datez10: parse_string(&res.loan_datez10)?,
104 bal_qtyz16: parse_number(&res.bal_qtyz16)?,
105 unstl_qtyz16: parse_number(&res.unstl_qtyz16)?,
106 slby_amtz16: parse_number(&res.slby_amtz16)?,
107 prsnt_pricez16: parse_number(&res.prsnt_pricez16)?,
108 lsnpf_amtz16: parse_number(&res.lsnpf_amtz16)?,
109 earn_ratez9: parse_ratio(&res.earn_ratez9)?,
110 mrgn_codez4: parse_string(&res.mrgn_codez4)?,
111 jan_qtyz16: parse_number(&res.jan_qtyz16)?,
112 expr_datez10: parse_string(&res.expr_datez10)?,
113 ass_amtz16: parse_number(&res.ass_amtz16)?,
114 issue_mgamt_ratez6: parse_ratio_str(&res.issue_mgamt_ratez6)?,
115 medo_slby_amtz16: parse_number(&res.medo_slby_amtz16)?,
116 post_lsnpf_amtz16: parse_number(&res.post_lsnpf_amtz16)?,
117 })
118}
119
120#[derive(Debug, Clone, Serialize)]
121struct C8201Response {
122 pub dpsit_amtz16: Option<i64>, pub mrgn_amtz16: Option<i64>, pub mgint_npaid_amtz16: Option<i64>, pub chgm_pos_amtz16: Option<i64>, pub cash_mrgn_amtz16: Option<i64>, pub subst_mgamt_amtz16: Option<i64>, pub coltr_ratez6: String, pub rcble_amtz16: Option<i64>, pub order_pos_csamtz16: Option<i64>, pub ecn_pos_csamtz16: Option<i64>, pub nordm_loan_amtz16: Option<i64>, pub etc_lend_amtz16: Option<i64>, pub subst_amtz16: Option<i64>, pub sln_sale_amtz16: Option<i64>, pub bal_buy_ttamtz16: Option<i64>, pub bal_ass_ttamtz16: Option<i64>, pub asset_tot_amtz16: Option<i64>, pub actvt_type10: String, pub lend_amtz16: Option<i64>, pub accnt_mgamt_ratez6: String, pub sl_mrgn_amtz16: Option<i64>, pub pos_csamt1z16: Option<i64>, pub pos_csamt2z16: Option<i64>, pub pos_csamt3z16: Option<i64>, pub pos_csamt4z16: Option<i64>, pub dpsit_amtz_d1_16: Option<i64>, pub dpsit_amtz_d2_16: Option<i64>, pub noticez30: String, pub tot_eal_plsz18: String, pub pft_rtz15: Option<f64>, }
153
154#[derive(Debug, Clone, Serialize)]
155struct C8201Response1 {
156 pub issue_codez6: String, pub issue_namez40: String, pub bal_typez6: String, pub loan_datez10: String, pub bal_qtyz16: Option<i64>, pub unstl_qtyz16: Option<i64>, pub slby_amtz16: Option<i64>, pub prsnt_pricez16: Option<i64>, pub lsnpf_amtz16: Option<i64>, pub earn_ratez9: Option<f64>, pub mrgn_codez4: String, pub jan_qtyz16: Option<i64>, pub expr_datez10: String, pub ass_amtz16: Option<i64>, pub issue_mgamt_ratez6: Option<f64>, pub medo_slby_amtz16: Option<i64>, pub post_lsnpf_amtz16: Option<i64>, }
174
175pub const BLOCK_NAME_C8201_OUT: &str = "c8201OutBlock";
176pub const BLOCK_NAME_C8201_OUT1_ARRAY: &str = "c8201OutBlock1";