use crate::model::{NumberString, deserialize_vec_or_empty_string};
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct OptionSummary {
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub uly: String,
#[serde(default)]
pub inst_family: String,
#[serde(default)]
pub delta: NumberString,
#[serde(default)]
pub gamma: NumberString,
#[serde(default)]
pub vega: NumberString,
#[serde(default)]
pub theta: NumberString,
#[serde(default)]
pub delta_bs: NumberString,
#[serde(default)]
pub gamma_bs: NumberString,
#[serde(default)]
pub vega_bs: NumberString,
#[serde(default)]
pub theta_bs: NumberString,
#[serde(default)]
pub lever: NumberString,
#[serde(default)]
pub mark_vol: NumberString,
#[serde(default)]
pub real_vol: NumberString,
#[serde(default)]
pub vol_lv: NumberString,
#[serde(default)]
pub bid_vol: NumberString,
#[serde(default)]
pub ask_vol: NumberString,
#[serde(default)]
pub fwd_px: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct EstimatedPrice {
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub settle_px: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct DiscountLevel {
#[serde(default)]
pub discount_rate: NumberString,
#[serde(default)]
pub min_amt: NumberString,
#[serde(default)]
pub max_amt: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct DiscountDetail {
#[serde(default)]
pub discount_rate: NumberString,
#[serde(default)]
pub liq_penalty_rate: NumberString,
#[serde(default)]
pub min_amt: NumberString,
#[serde(default)]
pub max_amt: NumberString,
#[serde(default)]
pub tier: String,
#[serde(default)]
pub dis_ccy_eq: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct DiscountRateInterestFreeQuota {
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub amt: NumberString,
#[serde(default)]
pub discount_lv: String,
#[serde(default)]
pub details: Vec<DiscountDetail>,
#[serde(default)]
pub collateral_restrict: bool,
#[serde(default)]
pub min_discount_rate: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LoanQuotaBasic {
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub rate: NumberString,
#[serde(default)]
pub quota: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LoanQuotaLevel {
#[serde(default)]
pub level: String,
#[serde(default)]
pub loan_quota_coef: NumberString,
#[serde(default)]
pub ir_discount: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LoanQuotaConfiguredCurrency {
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub rate: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LoanQuotaConfig {
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub stgy_type: String,
#[serde(default)]
pub quota: NumberString,
#[serde(default)]
pub level: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct InterestRateLoanQuota {
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub basic: Vec<LoanQuotaBasic>,
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub vip: Vec<LoanQuotaLevel>,
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub regular: Vec<LoanQuotaLevel>,
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub config_ccy_list: Vec<LoanQuotaConfiguredCurrency>,
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub config: Vec<LoanQuotaConfig>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct VipInterestRateLoanQuota {
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub level: String,
#[serde(default)]
pub rate: NumberString,
#[serde(default)]
pub quota: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct TickBandDetail {
#[serde(default)]
pub min_px: NumberString,
#[serde(default)]
pub max_px: NumberString,
#[serde(default)]
pub tick_sz: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct InstrumentTickBand {
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_family: String,
#[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
pub tick_band: Vec<TickBandDetail>,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct PublicOptionTrade {
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub trade_id: String,
#[serde(default)]
pub px: NumberString,
#[serde(default)]
pub sz: NumberString,
#[serde(default)]
pub side: String,
#[serde(default)]
pub fill_vol: NumberString,
#[serde(default)]
pub fwd_px: NumberString,
#[serde(default)]
pub idx_px: NumberString,
#[serde(default)]
pub mark_px: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct MarketDataHistory {
#[serde(default)]
pub module: String,
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub date_aggr_type: String,
#[serde(default)]
pub value: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn option_summary_ignores_future_fields() {
let row: OptionSummary = serde_json::from_str(
r#"{"instType":"OPTION","instId":"BTC-USD-1-C","delta":"0.5","futureField":"ok"}"#,
)
.unwrap();
assert_eq!(row.inst_type, "OPTION");
assert_eq!(row.inst_id, "BTC-USD-1-C");
}
}