exc_binance/websocket/protocol/frame/
trade.rs

1use rust_decimal::Decimal;
2use serde::Deserialize;
3
4use crate::websocket::error::WsError;
5
6use super::{Name, Nameable, StreamFrame, StreamFrameKind};
7
8/// # Example
9/// A [`Trade`] in JSON format:
10/// ```json
11/// {
12///     "e": "trade",     // Event type
13///     "E": 123456789,   // Event time
14///     "s": "BTCUSDT",   // Symbol
15///     "t": 12345,       // Trade ID
16///     "p": "0.001",     // Price
17///     "q": "100",       // Quantity
18///     "b": 88,          // Buyer order ID
19///     "a": 50,          // Seller order ID
20///     "T": 1591677567872,   // Trade time (ms)
21///     "S": "-1",        // "-1": sell; "1": buy
22/// }
23/// ```
24#[derive(Debug, Clone, Deserialize)]
25pub struct Trade {
26    /// Event type.
27    #[serde(rename = "e")]
28    pub event: String,
29    /// Event time.
30    #[serde(rename = "E")]
31    pub event_timestamp: i64,
32    /// Symbol.
33    #[serde(rename = "s")]
34    pub symbol: String,
35    /// Trade ID.
36    #[serde(rename = "t")]
37    pub trade_id: String,
38    /// Price.
39    #[serde(rename = "p")]
40    pub price: Decimal,
41    /// Quantity.
42    #[serde(rename = "q")]
43    pub size: Decimal,
44    /// Buyer order ID.
45    #[serde(rename = "b")]
46    pub buyer_order_id: Decimal,
47    /// Seller order ID.
48    #[serde(rename = "a")]
49    pub seller_order_id: Decimal,
50    /// Trade time (ms).
51    #[serde(rename = "T")]
52    pub trade_timestamp: i64,
53    /// "-1": sell; "1": buy
54    #[serde(rename = "S")]
55    pub side: String,
56}
57
58impl Trade {
59    /// Is buyer the market maker.
60    pub fn is_taker_buy(&self) -> bool {
61        self.side == "1"
62    }
63
64    /// Is taker sell.
65    pub fn is_taker_sell(&self) -> bool {
66        self.side == "-1"
67    }
68}
69
70impl Nameable for Trade {
71    fn to_name(&self) -> Name {
72        Name {
73            // FIXME: better way to determine the case (lower or upper).
74            inst: Some(self.symbol.clone()),
75            channel: self.event.clone(),
76        }
77    }
78}
79
80impl TryFrom<StreamFrame> for Trade {
81    type Error = WsError;
82
83    fn try_from(frame: StreamFrame) -> Result<Self, Self::Error> {
84        if let StreamFrameKind::Trade(trade) = frame.data {
85            Ok(trade)
86        } else {
87            Err(WsError::UnexpectedFrame(anyhow::anyhow!("{frame:?}")))
88        }
89    }
90}