exc_binance/websocket/protocol/frame/
book_ticker.rs

1use rust_decimal::Decimal;
2use serde::Deserialize;
3
4use crate::websocket::error::WsError;
5
6use super::{Name, Nameable, StreamFrame, StreamFrameKind};
7
8/// Book ticker.
9#[derive(Debug, Clone, Deserialize)]
10pub struct BookTicker {
11    /// Event type.
12    #[serde(rename = "e")]
13    pub event: Option<String>,
14    /// Event time.
15    #[serde(rename = "E")]
16    pub event_timestamp: Option<i64>,
17    /// Symbol.
18    #[serde(rename = "s")]
19    pub symbol: String,
20    /// Trade time.
21    #[serde(rename = "T")]
22    pub trade_timestamp: Option<i64>,
23    /// Book ticker ID.
24    #[serde(rename = "u")]
25    pub id: usize,
26    /// Best bid.
27    #[serde(rename = "b")]
28    pub bid: Decimal,
29    /// Best bid size.
30    #[serde(rename = "B")]
31    pub bid_size: Decimal,
32    /// Best bid.
33    #[serde(rename = "a")]
34    pub ask: Decimal,
35    /// Best bid size.
36    #[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}