exc_binance/websocket/protocol/frame/
agg_trade.rs1use rust_decimal::Decimal;
2use serde::Deserialize;
3
4use crate::websocket::error::WsError;
5
6use super::{Name, Nameable, StreamFrame, StreamFrameKind};
7
8#[derive(Debug, Clone, Deserialize)]
25pub struct AggTrade {
26 #[serde(rename = "e")]
28 pub event: String,
29 #[serde(rename = "E")]
31 pub event_timestamp: i64,
32 #[serde(rename = "s")]
34 pub symbol: String,
35 #[serde(rename = "a")]
37 pub aggregate_id: usize,
38 #[serde(rename = "p")]
40 pub price: Decimal,
41 #[serde(rename = "q")]
43 pub size: Decimal,
44 #[serde(rename = "f")]
46 pub first_id: usize,
47 #[serde(rename = "l")]
49 pub last_id: usize,
50 #[serde(rename = "T")]
52 pub trade_timestamp: i64,
53 #[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}