barter_data/exchange/bitmex/message.rs
1use crate::{Identifier, exchange::bitmex::trade::BitmexTrade};
2use barter_integration::subscription::SubscriptionId;
3use serde::{Deserialize, Serialize};
4use smol_str::format_smolstr;
5
6/// ### Raw Payload Examples
7/// See docs: <https://www.bitmex.com/app/wsAPI#Response-Format>
8/// #### Trade payload
9/// ```json
10/// {
11/// "table": "trade",
12/// "action": "insert",
13/// "data": [
14/// {
15/// "timestamp": "2023-02-18T09:27:59.701Z",
16/// "symbol": "XBTUSD",
17/// "side": "Sell",
18/// "size": 200,
19/// "price": 24564.5,
20/// "tickDirection": "MinusTick",
21/// "trdMatchID": "31e50cb7-e005-a44e-f354-86e88dff52eb",
22/// "grossValue": 814184,
23/// "homeNotional": 0.00814184,
24/// "foreignNotional": 200,
25/// "trdType": "Regular"
26/// }
27/// ]
28/// }
29///```
30#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deserialize, Serialize)]
31pub struct BitmexMessage<T> {
32 pub table: String,
33 pub data: Vec<T>,
34}
35
36impl Identifier<Option<SubscriptionId>> for BitmexTrade {
37 fn id(&self) -> Option<SubscriptionId> {
38 self.data
39 .first()
40 .map(|trade| SubscriptionId(format_smolstr!("{}|{}", self.table, trade.symbol)))
41 .or(None)
42 }
43}