use nautilus_core::serialization::{
deserialize_decimal_from_str, deserialize_optional_decimal_from_str, deserialize_string_to_u64,
serialize_decimal_as_str, serialize_optional_decimal_as_str,
};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize, Serializer};
use ustr::Ustr;
use super::enums::{OKXOptionType, OKXTriggerType};
use crate::common::{
enums::{
OKXContractType, OKXInstrumentCategory, OKXInstrumentStatus, OKXInstrumentType,
OKXRpiPermission,
},
parse::{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, PartialEq, Eq, Serialize, Deserialize)]
pub struct OKXRpiBookLevel(
#[serde(
serialize_with = "serialize_decimal_as_str",
deserialize_with = "deserialize_decimal_from_str"
)]
pub Decimal,
#[serde(
serialize_with = "serialize_decimal_as_str",
deserialize_with = "deserialize_decimal_from_str"
)]
pub Decimal,
#[serde(
serialize_with = "serialize_decimal_as_str",
deserialize_with = "deserialize_decimal_from_str"
)]
pub Decimal,
#[serde(
serialize_with = "serialize_u64_as_str",
deserialize_with = "deserialize_string_to_u64"
)]
pub u64,
);
fn serialize_u64_as_str<S>(value: &u64, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&value.to_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)]
pub inst_category: Option<OKXInstrumentCategory>,
#[serde(default)]
pub init_px_lmt_pct: String,
#[serde(default)]
pub float_px_lmt_pct: String,
#[serde(default)]
pub max_px_lmt_pct: 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,
#[serde(default, alias = "elp")]
pub rpi: Option<OKXRpiPermission>,
#[serde(default, deserialize_with = "deserialize_optional_string_to_u64")]
pub rpi_min_level: Option<u64>,
#[serde(
default,
serialize_with = "serialize_optional_decimal_as_str",
deserialize_with = "deserialize_optional_decimal_from_str"
)]
pub rpi_min_px_band: Option<Decimal>,
}