use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct OrderData {
#[serde(rename = "category")]
#[serde(default)]
pub category: Option<String>,
#[serde(rename = "symbol")]
#[serde(default)]
pub symbol: 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 = "blockTradeId")]
#[serde(default)]
pub block_trade_id: Option<String>,
#[serde(rename = "side")]
#[serde(default)]
pub side: 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 = "price")]
#[serde(default)]
pub price: Option<String>,
#[serde(rename = "qty")]
#[serde(default)]
pub qty: Option<String>,
#[serde(rename = "timeInForce")]
#[serde(default)]
pub time_in_force: Option<String>,
#[serde(rename = "orderStatus")]
#[serde(default)]
pub order_status: Option<String>,
#[serde(rename = "leavesQty")]
#[serde(default)]
pub leaves_qty: Option<String>,
#[serde(rename = "cumExecQty")]
#[serde(default)]
pub cum_exec_qty: Option<String>,
#[serde(rename = "cumExecValue")]
#[serde(default)]
pub cum_exec_value: Option<String>,
#[serde(rename = "cumExecFee")]
#[serde(default)]
pub cum_exec_fee: Option<String>,
#[serde(rename = "avgPrice")]
#[serde(default)]
pub avg_price: Option<String>,
#[serde(rename = "rejectReason")]
#[serde(default)]
pub reject_reason: Option<String>,
#[serde(rename = "cancelType")]
#[serde(default)]
pub cancel_type: Option<String>,
#[serde(rename = "createType")]
#[serde(default)]
pub create_type: Option<String>,
#[serde(rename = "isLeverage")]
#[serde(default)]
pub is_leverage: Option<String>,
#[serde(rename = "positionIdx")]
#[serde(default)]
pub position_idx: Option<i32>,
#[serde(rename = "takeProfit")]
#[serde(default)]
pub take_profit: Option<String>,
#[serde(rename = "stopLoss")]
#[serde(default)]
pub stop_loss: Option<String>,
#[serde(rename = "triggerPrice")]
#[serde(default)]
pub trigger_price: Option<String>,
#[serde(rename = "triggerDirection")]
#[serde(default)]
pub trigger_direction: Option<i32>,
#[serde(rename = "triggerBy")]
#[serde(default)]
pub trigger_by: Option<String>,
#[serde(rename = "reduceOnly")]
#[serde(default)]
pub reduce_only: Option<bool>,
#[serde(rename = "closeOnTrigger")]
#[serde(default)]
pub close_on_trigger: Option<bool>,
#[serde(rename = "smpType")]
#[serde(default)]
pub smp_type: Option<String>,
#[serde(rename = "smpGroup")]
#[serde(default)]
pub smp_group: Option<i32>,
#[serde(rename = "createdTime")]
#[serde(default)]
pub created_time: Option<String>,
#[serde(rename = "updatedTime")]
#[serde(default)]
pub updated_time: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_order() {
let json = serde_json::json!({
"category": "linear",
"symbol": "BTCUSDT",
"orderId": "order-789",
"side": "Buy",
"orderType": "Limit",
"price": "50000.00",
"qty": "0.01",
"orderStatus": "New",
"leavesQty": "0.01",
"cumExecQty": "0"
});
let order: OrderData = serde_json::from_value(json).unwrap();
assert_eq!(order.symbol.as_deref(), Some("BTCUSDT"));
assert_eq!(order.order_status.as_deref(), Some("New"));
assert_eq!(order.qty.as_deref(), Some("0.01"));
}
}