use serde::{Deserialize, Serialize};
use ustr::Ustr;
use super::enums::{OKXOptionType, OKXTriggerType};
use crate::common::{
enums::{OKXContractType, OKXInstrumentStatus, OKXInstrumentType},
parse::{
deserialize_empty_string_as_none, deserialize_empty_ustr_as_none,
deserialize_optional_string_to_u64,
},
};
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OKXAttachedAlgoOrd {
#[serde(default)]
pub attach_algo_id: String,
#[serde(default)]
pub attach_algo_cl_ord_id: String,
#[serde(default)]
pub sl_trigger_px: String,
#[serde(default)]
pub sl_ord_px: String,
#[serde(default)]
pub sl_trigger_px_type: Option<OKXTriggerType>,
#[serde(default)]
pub tp_trigger_px: String,
#[serde(default)]
pub tp_ord_px: String,
#[serde(default)]
pub tp_trigger_px_type: Option<OKXTriggerType>,
#[serde(default)]
pub callback_ratio: String,
#[serde(default)]
pub callback_spread: String,
#[serde(default)]
pub active_px: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OKXInstrument {
pub inst_type: OKXInstrumentType,
pub inst_id: Ustr,
#[serde(default)]
pub inst_id_code: Option<u64>,
pub uly: Ustr,
pub inst_family: Ustr,
#[serde(default, deserialize_with = "deserialize_empty_ustr_as_none")]
pub series_id: Option<Ustr>,
#[serde(
default,
alias = "category",
deserialize_with = "deserialize_empty_string_as_none"
)]
pub inst_category: Option<String>,
pub base_ccy: Ustr,
pub quote_ccy: Ustr,
pub settle_ccy: Ustr,
pub ct_val: String,
pub ct_mult: String,
pub ct_val_ccy: String,
pub opt_type: OKXOptionType,
pub stk: String,
#[serde(deserialize_with = "deserialize_optional_string_to_u64")]
pub list_time: Option<u64>,
#[serde(deserialize_with = "deserialize_optional_string_to_u64")]
pub exp_time: Option<u64>,
pub lever: String,
pub tick_sz: String,
pub lot_sz: String,
pub min_sz: String,
pub ct_type: OKXContractType,
pub state: OKXInstrumentStatus,
pub rule_type: String,
#[serde(default)]
pub max_lmt_sz: String,
#[serde(default)]
pub max_mkt_sz: String,
#[serde(default)]
pub max_lmt_amt: String,
#[serde(default)]
pub max_mkt_amt: String,
#[serde(default)]
pub max_twap_sz: String,
#[serde(default)]
pub max_iceberg_sz: String,
#[serde(default)]
pub max_trigger_sz: String,
#[serde(default)]
pub max_stop_sz: String,
}