use nautilus_network::websocket::WebSocketClient;
use serde::{Deserialize, Serialize};
use ustr::Ustr;
use crate::{
common::enums::{BinanceKlineInterval, BinanceWsMethod},
spot::websocket::streams::messages::{
BinanceWsErrorMsg, BinanceWsErrorResponse, BinanceWsResponse,
},
};
#[derive(Debug, Clone)]
pub enum BinanceSpotPublicWsMessage {
Trade(BinanceSpotTradeMsg),
BookTicker(BinanceSpotBookTickerMsg),
DepthSnapshot(BinanceSpotPartialDepthMsg),
DepthDiff(BinanceSpotDepthDiffMsg),
Kline(BinanceSpotKlineMsg),
ServerShutdown(BinanceSpotServerShutdownMsg),
RawJson(serde_json::Value),
Error(BinanceWsErrorMsg),
Reconnected,
}
#[allow(
missing_debug_implementations,
clippy::large_enum_variant,
reason = "Commands are ephemeral and immediately consumed"
)]
pub enum BinanceSpotPublicWsCommand {
SetClient(WebSocketClient),
Disconnect,
Subscribe { streams: Vec<String> },
Unsubscribe { streams: Vec<String> },
}
#[derive(Debug, Clone, Serialize)]
pub struct BinanceWsSubscription {
pub method: BinanceWsMethod,
pub params: Vec<String>,
pub id: u64,
}
impl BinanceWsSubscription {
#[must_use]
pub fn subscribe(streams: Vec<String>, id: u64) -> Self {
Self {
method: BinanceWsMethod::Subscribe,
params: streams,
id,
}
}
#[must_use]
pub fn unsubscribe(streams: Vec<String>, id: u64) -> Self {
Self {
method: BinanceWsMethod::Unsubscribe,
params: streams,
id,
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceCombinedStreamEvent {
pub stream: String,
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotTradeMsg {
#[serde(rename = "e")]
pub event_type: String,
#[serde(rename = "E")]
pub event_time: i64,
#[serde(rename = "s")]
pub symbol: Ustr,
#[serde(rename = "t")]
pub trade_id: u64,
#[serde(rename = "p")]
pub price: String,
#[serde(rename = "q")]
pub quantity: String,
#[serde(rename = "T")]
pub trade_time: i64,
#[serde(rename = "m")]
pub is_buyer_maker: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotBookTickerMsg {
#[serde(rename = "e", default)]
pub event_type: Option<String>,
#[serde(rename = "E", default)]
pub event_time: Option<i64>,
#[serde(rename = "s")]
pub symbol: Ustr,
#[serde(rename = "u")]
pub book_update_id: u64,
#[serde(rename = "b")]
pub best_bid_price: String,
#[serde(rename = "B")]
pub best_bid_qty: String,
#[serde(rename = "a")]
pub best_ask_price: String,
#[serde(rename = "A")]
pub best_ask_qty: String,
#[serde(rename = "T", default)]
pub transaction_time: Option<i64>,
}
#[derive(Debug, Clone)]
pub struct BinanceSpotPartialDepthMsg {
pub symbol: Ustr,
pub last_update_id: u64,
pub bids: Vec<[String; 2]>,
pub asks: Vec<[String; 2]>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotPartialDepthPayload {
#[serde(rename = "lastUpdateId")]
pub last_update_id: u64,
pub bids: Vec<[String; 2]>,
pub asks: Vec<[String; 2]>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotDepthDiffMsg {
#[serde(rename = "e")]
pub event_type: String,
#[serde(rename = "E")]
pub event_time: i64,
#[serde(rename = "s")]
pub symbol: Ustr,
#[serde(rename = "U")]
pub first_update_id: u64,
#[serde(rename = "u")]
pub final_update_id: u64,
#[serde(rename = "b")]
pub bids: Vec<[String; 2]>,
#[serde(rename = "a")]
pub asks: Vec<[String; 2]>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotKlineMsg {
#[serde(rename = "e")]
pub event_type: String,
#[serde(rename = "E")]
pub event_time: i64,
#[serde(rename = "s")]
pub symbol: Ustr,
#[serde(rename = "k")]
pub kline: BinanceSpotKlineData,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotKlineData {
#[serde(rename = "t")]
pub start_time: i64,
#[serde(rename = "T")]
pub close_time: i64,
#[serde(rename = "s")]
pub symbol: Ustr,
#[serde(rename = "i")]
pub interval: BinanceKlineInterval,
#[serde(rename = "f")]
pub first_trade_id: i64,
#[serde(rename = "L")]
pub last_trade_id: i64,
#[serde(rename = "o")]
pub open: String,
#[serde(rename = "c")]
pub close: String,
#[serde(rename = "h")]
pub high: String,
#[serde(rename = "l")]
pub low: String,
#[serde(rename = "v")]
pub volume: String,
#[serde(rename = "n")]
pub num_trades: i64,
#[serde(rename = "x")]
pub is_closed: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct BinanceSpotServerShutdownMsg {
#[serde(rename = "e")]
pub event_type: String,
#[serde(rename = "E")]
pub event_time: i64,
}
pub type BinanceSpotWsResponse = BinanceWsResponse;
pub type BinanceSpotWsErrorResponse = BinanceWsErrorResponse;