exc_binance/websocket/protocol/frame/
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 Trade {
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 = "t")]
37 pub trade_id: String,
38 #[serde(rename = "p")]
40 pub price: Decimal,
41 #[serde(rename = "q")]
43 pub size: Decimal,
44 #[serde(rename = "b")]
46 pub buyer_order_id: Decimal,
47 #[serde(rename = "a")]
49 pub seller_order_id: Decimal,
50 #[serde(rename = "T")]
52 pub trade_timestamp: i64,
53 #[serde(rename = "S")]
55 pub side: String,
56}
57
58impl Trade {
59 pub fn is_taker_buy(&self) -> bool {
61 self.side == "1"
62 }
63
64 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 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}