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}