exc_binance/websocket/protocol/frame/
agg_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 [`AggTrade`] in JSON format:
10/// ```json
11/// {
12///     "e": "aggTrade",  // Event type
13///     "E": 123456789,   // Event time
14///     "s": "BTCUSDT",   // Symbol
15///     "a": 5933014,     // Aggregate trade ID
16///     "p": "0.001",     // Price
17///     "q": "100",       // Quantity
18///     "f": 100,         // First trade ID
19///     "l": 105,         // Last trade ID
20///     "T": 123456785,   // Trade time
21///     "m": true,        // Is the buyer the market maker?
22/// }
23/// ```
24#[derive(Debug, Clone, Deserialize)]
25pub struct AggTrade {
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    /// Aggregate trade ID.
36    #[serde(rename = "a")]
37    pub aggregate_id: usize,
38    /// Price.
39    #[serde(rename = "p")]
40    pub price: Decimal,
41    /// Quantity.
42    #[serde(rename = "q")]
43    pub size: Decimal,
44    /// First trade ID.
45    #[serde(rename = "f")]
46    pub first_id: usize,
47    /// Last trade ID.
48    #[serde(rename = "l")]
49    pub last_id: usize,
50    /// Trade time.
51    #[serde(rename = "T")]
52    pub trade_timestamp: i64,
53    /// Is buyer the market maker.
54    #[serde(rename = "m")]
55    pub buy_maker: bool,
56}
57
58impl Nameable for AggTrade {
59    fn to_name(&self) -> Name {
60        Name {
61            inst: Some(self.symbol.to_lowercase()),
62            channel: self.event.clone(),
63        }
64    }
65}
66
67impl TryFrom<StreamFrame> for AggTrade {
68    type Error = WsError;
69
70    fn try_from(frame: StreamFrame) -> Result<Self, Self::Error> {
71        if let StreamFrameKind::AggTrade(trade) = frame.data {
72            Ok(trade)
73        } else {
74            Err(WsError::UnexpectedFrame(anyhow::anyhow!("{frame:?}")))
75        }
76    }
77}