exc_binance/websocket/protocol/frame/
book_ticker.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)]
10pub struct BookTicker {
11 #[serde(rename = "e")]
13 pub event: Option<String>,
14 #[serde(rename = "E")]
16 pub event_timestamp: Option<i64>,
17 #[serde(rename = "s")]
19 pub symbol: String,
20 #[serde(rename = "T")]
22 pub trade_timestamp: Option<i64>,
23 #[serde(rename = "u")]
25 pub id: usize,
26 #[serde(rename = "b")]
28 pub bid: Decimal,
29 #[serde(rename = "B")]
31 pub bid_size: Decimal,
32 #[serde(rename = "a")]
34 pub ask: Decimal,
35 #[serde(rename = "A")]
37 pub ask_size: Decimal,
38}
39
40impl Nameable for BookTicker {
41 fn to_name(&self) -> Name {
42 Name {
43 inst: Some(self.symbol.to_lowercase()),
44 channel: self
45 .event
46 .clone()
47 .unwrap_or_else(|| String::from("bookTicker")),
48 }
49 }
50}
51
52impl TryFrom<StreamFrame> for BookTicker {
53 type Error = WsError;
54
55 fn try_from(frame: StreamFrame) -> Result<Self, Self::Error> {
56 if let StreamFrameKind::BookTicker(t) = frame.data {
57 Ok(t)
58 } else {
59 Err(WsError::UnexpectedFrame(anyhow::anyhow!("{frame:?}")))
60 }
61 }
62}