use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct ExecutionData {
#[serde(rename = "category")]
#[serde(default)]
pub category: Option<String>,
#[serde(rename = "symbol")]
#[serde(default)]
pub symbol: Option<String>,
#[serde(rename = "execFee")]
#[serde(default)]
pub exec_fee: Option<String>,
#[serde(rename = "execId")]
#[serde(default)]
pub exec_id: Option<String>,
#[serde(rename = "execPrice")]
#[serde(default)]
pub exec_price: Option<String>,
#[serde(rename = "execQty")]
#[serde(default)]
pub exec_qty: Option<String>,
#[serde(rename = "execType")]
#[serde(default)]
pub exec_type: Option<String>,
#[serde(rename = "execValue")]
#[serde(default)]
pub exec_value: Option<String>,
#[serde(rename = "feeCurrency")]
#[serde(default)]
pub fee_currency: Option<String>,
#[serde(rename = "isMaker")]
#[serde(default)]
pub is_maker: Option<bool>,
#[serde(rename = "feeRate")]
#[serde(default)]
pub fee_rate: Option<String>,
#[serde(rename = "tradeIv")]
#[serde(default)]
pub trade_iv: Option<String>,
#[serde(rename = "markIv")]
#[serde(default)]
pub mark_iv: Option<String>,
#[serde(rename = "indexIv")]
#[serde(default)]
pub index_iv: Option<String>,
#[serde(rename = "blockTradeId")]
#[serde(default)]
pub block_trade_id: Option<String>,
#[serde(rename = "markPrice")]
#[serde(default)]
pub mark_price: Option<String>,
#[serde(rename = "indexPrice")]
#[serde(default)]
pub index_price: Option<String>,
#[serde(rename = "underlyingPrice")]
#[serde(default)]
pub underlying_price: Option<String>,
#[serde(rename = "orderId")]
#[serde(default)]
pub order_id: Option<String>,
#[serde(rename = "orderLinkId")]
#[serde(default)]
pub order_link_id: Option<String>,
#[serde(rename = "orderPrice")]
#[serde(default)]
pub order_price: Option<String>,
#[serde(rename = "orderQty")]
#[serde(default)]
pub order_qty: Option<String>,
#[serde(rename = "orderType")]
#[serde(default)]
pub order_type: Option<String>,
#[serde(rename = "stopOrderType")]
#[serde(default)]
pub stop_order_type: Option<String>,
#[serde(rename = "side")]
#[serde(default)]
pub side: Option<String>,
#[serde(rename = "execTime")]
#[serde(default)]
pub exec_time: Option<String>,
#[serde(rename = "isLeverage")]
#[serde(default)]
pub is_leverage: Option<String>,
#[serde(rename = "closedSize")]
#[serde(default)]
pub closed_size: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_execution() {
let json = serde_json::json!({
"category": "linear",
"symbol": "BTCUSDT",
"execId": "abc-123",
"execPrice": "50000.00",
"execQty": "0.01",
"execType": "Trade",
"side": "Buy",
"orderId": "order-456",
"isMaker": false
});
let exec: ExecutionData = serde_json::from_value(json).unwrap();
assert_eq!(exec.symbol.as_deref(), Some("BTCUSDT"));
assert_eq!(exec.side.as_deref(), Some("Buy"));
assert_eq!(exec.exec_qty.as_deref(), Some("0.01"));
}
}