use rust_decimal::Decimal;
use serde::Deserialize;
use crate::websocket::error::WsError;
use super::{Name, Nameable, StreamFrame, StreamFrameKind};
#[derive(Debug, Clone, Deserialize)]
pub struct BookTicker {
#[serde(rename = "e")]
pub event: Option<String>,
#[serde(rename = "E")]
pub event_timestamp: Option<i64>,
#[serde(rename = "s")]
pub symbol: String,
#[serde(rename = "T")]
pub trade_timestamp: Option<i64>,
#[serde(rename = "u")]
pub id: usize,
#[serde(rename = "b")]
pub bid: Decimal,
#[serde(rename = "B")]
pub bid_size: Decimal,
#[serde(rename = "a")]
pub ask: Decimal,
#[serde(rename = "A")]
pub ask_size: Decimal,
}
impl Nameable for BookTicker {
fn to_name(&self) -> Name {
Name {
inst: Some(self.symbol.to_lowercase()),
channel: self
.event
.clone()
.unwrap_or_else(|| String::from("bookTicker")),
}
}
}
impl TryFrom<StreamFrame> for BookTicker {
type Error = WsError;
fn try_from(frame: StreamFrame) -> Result<Self, Self::Error> {
if let StreamFrameKind::BookTicker(t) = frame.data {
Ok(t)
} else {
Err(WsError::UnexpectedFrame(anyhow::anyhow!("{frame:?}")))
}
}
}