bybit_rust_api/ws/public/
trade.rs1use serde::Deserialize;
7
8#[derive(Debug, Clone, Deserialize)]
10pub struct PublicTrade {
11 #[serde(rename = "i")]
13 #[serde(default)]
14 pub trade_id: Option<String>,
15 #[serde(rename = "T")]
17 #[serde(default)]
18 pub timestamp: Option<i64>,
19 #[serde(rename = "s")]
21 #[serde(default)]
22 pub symbol: Option<String>,
23 #[serde(rename = "S")]
25 #[serde(default)]
26 pub side: Option<String>,
27 #[serde(rename = "p")]
29 #[serde(default)]
30 pub price: Option<String>,
31 #[serde(rename = "v")]
33 #[serde(default)]
34 pub size: Option<String>,
35 #[serde(rename = "L")]
37 #[serde(default)]
38 pub direction: Option<String>,
39 #[serde(rename = "BT")]
41 #[serde(default)]
42 pub block_trade: Option<bool>,
43}
44
45pub struct TradeStream;
49
50impl TradeStream {
51 pub fn parse(data: &serde_json::Value) -> serde_json::Result<Vec<PublicTrade>> {
53 serde_json::from_value(data.clone())
54 }
55
56 pub fn matches_topic(topic: &str) -> bool {
58 topic.starts_with("publicTrade.")
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn test_parse_trades() {
68 let json = serde_json::json!([
69 {
70 "i": "123456",
71 "T": 1672828800000_i64,
72 "s": "BTCUSDT",
73 "S": "Buy",
74 "p": "50000.00",
75 "v": "0.01",
76 "L": "PlusTick",
77 "BT": false
78 }
79 ]);
80
81 let trades = TradeStream::parse(&json).unwrap();
82 assert_eq!(trades.len(), 1);
83 assert_eq!(trades[0].side.as_deref(), Some("Buy"));
84 assert_eq!(trades[0].price.as_deref(), Some("50000.00"));
85 }
86
87 #[test]
88 fn test_matches_topic() {
89 assert!(TradeStream::matches_topic("publicTrade.BTCUSDT"));
90 assert!(!TradeStream::matches_topic("orderbook.1.BTCUSDT"));
91 }
92}