use std::ffi::c_char;
use std::mem::size_of;
use std::sync::Arc;
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use crate::utils::{parse_number, parse_ratio, parse_ratio_str, parse_string};
use crate::{error::*, models::*};
use qvopenapi_bindings::{Tc8201InBlock, Tc8201OutBlock, Tc8201OutBlock1};
pub const TR_CODE_C8201: &str = "c8201";
#[derive(Debug, Clone, Deserialize)]
pub struct C8201Request {
pub account_index: i32,
pub balance_type: char,
}
impl C8201Request {
pub fn new(account_index: i32, balance_type: char) -> C8201Request {
C8201Request {
account_index,
balance_type,
}
}
pub fn into_raw(&self) -> Arc<RawQueryRequest<Tc8201InBlock>> {
Arc::new(RawQueryRequest::new(
TR_CODE_C8201,
self.account_index,
Box::new(Tc8201InBlock {
pswd_noz44: [' ' as c_char; 44],
_pswd_noz44: ' ' as c_char,
bnc_bse_cdz1: [self.balance_type as c_char],
_bnc_bse_cdz1: ' ' as c_char,
}),
))
}
}
pub fn parse_c8201_response(
block_data: *const c_char,
_block_len: i32,
) -> Result<Value, QvOpenApiError> {
unsafe {
let res = &(*(block_data as *const Tc8201OutBlock));
Ok(json!(C8201Response {
dpsit_amtz16: parse_number(&res.dpsit_amtz16)?,
mrgn_amtz16: parse_number(&res.dpsit_amtz16)?,
mgint_npaid_amtz16: parse_number(&res.mgint_npaid_amtz16)?,
chgm_pos_amtz16: parse_number(&res.chgm_pos_amtz16)?,
cash_mrgn_amtz16: parse_number(&res.cash_mrgn_amtz16)?,
subst_mgamt_amtz16: parse_number(&res.subst_mgamt_amtz16)?,
coltr_ratez6: parse_string(&res.coltr_ratez6)?,
rcble_amtz16: parse_number(&res.rcble_amtz16)?,
order_pos_csamtz16: parse_number(&res.order_pos_csamtz16)?,
ecn_pos_csamtz16: parse_number(&res.ecn_pos_csamtz16)?,
nordm_loan_amtz16: parse_number(&res.nordm_loan_amtz16)?,
etc_lend_amtz16: parse_number(&res.etc_lend_amtz16)?,
subst_amtz16: parse_number(&res.subst_amtz16)?,
sln_sale_amtz16: parse_number(&res.sln_sale_amtz16)?,
bal_buy_ttamtz16: parse_number(&res.bal_buy_ttamtz16)?,
bal_ass_ttamtz16: parse_number(&res.bal_ass_ttamtz16)?,
asset_tot_amtz16: parse_number(&res.asset_tot_amtz16)?,
actvt_type10: parse_string(&res.actvt_type10)?,
lend_amtz16: parse_number(&res.lend_amtz16)?,
accnt_mgamt_ratez6: parse_string(&res.accnt_mgamt_ratez6)?,
sl_mrgn_amtz16: parse_number(&res.sl_mrgn_amtz16)?,
pos_csamt1z16: parse_number(&res.pos_csamt1z16)?,
pos_csamt2z16: parse_number(&res.pos_csamt2z16)?,
pos_csamt3z16: parse_number(&res.pos_csamt3z16)?,
pos_csamt4z16: parse_number(&res.pos_csamt4z16)?,
dpsit_amtz_d1_16: parse_number(&res.dpsit_amtz_d1_16)?,
dpsit_amtz_d2_16: parse_number(&res.dpsit_amtz_d2_16)?,
noticez30: parse_string(&res.noticez30)?,
tot_eal_plsz18: parse_string(&res.tot_eal_plsz18)?,
pft_rtz15: parse_ratio(&res.pft_rtz15)?,
}))
}
}
pub fn parse_c8201_response1_array(
block_data: *const c_char,
block_len: i32,
) -> Result<Value, QvOpenApiError> {
unsafe {
let block_count = block_len as usize / size_of::<Tc8201OutBlock1>();
let res: &[Tc8201OutBlock1] =
core::slice::from_raw_parts(block_data as *const Tc8201OutBlock1, block_count);
let ret: Result<Vec<C8201Response1>, QvOpenApiError> =
res.iter().map(parse_c8201_response1).collect();
Ok(json!(ret?))
}
}
fn parse_c8201_response1(res: &Tc8201OutBlock1) -> Result<C8201Response1, QvOpenApiError> {
Ok(C8201Response1 {
issue_codez6: parse_string(&res.issue_codez6)?,
issue_namez40: parse_string(&res.issue_namez40)?,
bal_typez6: parse_string(&res.bal_typez6)?,
loan_datez10: parse_string(&res.loan_datez10)?,
bal_qtyz16: parse_number(&res.bal_qtyz16)?,
unstl_qtyz16: parse_number(&res.unstl_qtyz16)?,
slby_amtz16: parse_number(&res.slby_amtz16)?,
prsnt_pricez16: parse_number(&res.prsnt_pricez16)?,
lsnpf_amtz16: parse_number(&res.lsnpf_amtz16)?,
earn_ratez9: parse_ratio(&res.earn_ratez9)?,
mrgn_codez4: parse_string(&res.mrgn_codez4)?,
jan_qtyz16: parse_number(&res.jan_qtyz16)?,
expr_datez10: parse_string(&res.expr_datez10)?,
ass_amtz16: parse_number(&res.ass_amtz16)?,
issue_mgamt_ratez6: parse_ratio_str(&res.issue_mgamt_ratez6)?,
medo_slby_amtz16: parse_number(&res.medo_slby_amtz16)?,
post_lsnpf_amtz16: parse_number(&res.post_lsnpf_amtz16)?,
})
}
#[derive(Debug, Clone, Serialize)]
struct C8201Response {
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>, }
#[derive(Debug, Clone, Serialize)]
struct C8201Response1 {
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>, }
pub const BLOCK_NAME_C8201_OUT: &str = "c8201OutBlock";
pub const BLOCK_NAME_C8201_OUT1_ARRAY: &str = "c8201OutBlock1";