bybit_rust_api/ws/private/
position.rs1use serde::Deserialize;
8
9#[derive(Debug, Clone, Deserialize)]
11pub struct PositionData {
12 #[serde(rename = "positionIdx")]
14 #[serde(default)]
15 pub position_idx: Option<i32>,
16 #[serde(rename = "riskId")]
18 #[serde(default)]
19 pub risk_id: Option<i32>,
20 #[serde(rename = "symbol")]
22 #[serde(default)]
23 pub symbol: Option<String>,
24 #[serde(rename = "side")]
26 #[serde(default)]
27 pub side: Option<String>,
28 #[serde(rename = "size")]
30 #[serde(default)]
31 pub size: Option<String>,
32 #[serde(rename = "positionValue")]
34 #[serde(default)]
35 pub position_value: Option<String>,
36 #[serde(rename = "entryPrice")]
38 #[serde(default)]
39 pub entry_price: Option<String>,
40 #[serde(rename = "tradeMode")]
42 #[serde(default)]
43 pub trade_mode: Option<i32>,
44 #[serde(rename = "autoAddMargin")]
46 #[serde(default)]
47 pub auto_add_margin: Option<i32>,
48 #[serde(rename = "leverage")]
50 #[serde(default)]
51 pub leverage: Option<String>,
52 #[serde(rename = "positionStatus")]
54 #[serde(default)]
55 pub position_status: Option<String>,
56 #[serde(rename = "markPrice")]
58 #[serde(default)]
59 pub mark_price: Option<String>,
60 #[serde(rename = "liqPrice")]
62 #[serde(default)]
63 pub liq_price: Option<String>,
64 #[serde(rename = "bustPrice")]
66 #[serde(default)]
67 pub bust_price: Option<String>,
68 #[serde(rename = "unrealisedPnl")]
70 #[serde(default)]
71 pub unrealised_pnl: Option<String>,
72 #[serde(rename = "cumRealisedPnl")]
74 #[serde(default)]
75 pub cum_realised_pnl: Option<String>,
76 #[serde(rename = "takeProfit")]
78 #[serde(default)]
79 pub take_profit: Option<String>,
80 #[serde(rename = "stopLoss")]
82 #[serde(default)]
83 pub stop_loss: Option<String>,
84 #[serde(rename = "trailingStop")]
86 #[serde(default)]
87 pub trailing_stop: Option<String>,
88 #[serde(rename = "positionIM")]
90 #[serde(default)]
91 pub position_im: Option<String>,
92 #[serde(rename = "positionMM")]
94 #[serde(default)]
95 pub position_mm: Option<String>,
96 #[serde(rename = "createdTime")]
98 #[serde(default)]
99 pub created_time: Option<String>,
100 #[serde(rename = "updatedTime")]
102 #[serde(default)]
103 pub updated_time: Option<String>,
104 #[serde(rename = "category")]
106 #[serde(default)]
107 pub category: Option<String>,
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn test_parse_position() {
116 let json = serde_json::json!({
117 "positionIdx": 0,
118 "symbol": "BTCUSDT",
119 "side": "Buy",
120 "size": "0.5",
121 "entryPrice": "50000.00",
122 "markPrice": "50100.00",
123 "unrealisedPnl": "50.00",
124 "leverage": "10",
125 "category": "linear"
126 });
127
128 let pos: PositionData = serde_json::from_value(json).unwrap();
129 assert_eq!(pos.symbol.as_deref(), Some("BTCUSDT"));
130 assert_eq!(pos.side.as_deref(), Some("Buy"));
131 assert_eq!(pos.size.as_deref(), Some("0.5"));
132 }
133}