nautilus_binance/spot/websocket/public_json/
messages.rs1use nautilus_network::websocket::WebSocketClient;
19use serde::{Deserialize, Serialize};
20use ustr::Ustr;
21
22use crate::{
23 common::enums::{BinanceKlineInterval, BinanceWsMethod},
24 spot::websocket::streams::messages::{
25 BinanceWsErrorMsg, BinanceWsErrorResponse, BinanceWsResponse,
26 },
27};
28
29#[derive(Debug, Clone)]
31pub enum BinanceSpotPublicWsMessage {
32 Trade(BinanceSpotTradeMsg),
34 BookTicker(BinanceSpotBookTickerMsg),
36 DepthSnapshot(BinanceSpotPartialDepthMsg),
38 DepthDiff(BinanceSpotDepthDiffMsg),
40 Kline(BinanceSpotKlineMsg),
42 Ticker(BinanceSpotTickerMsg),
44 ServerShutdown(BinanceSpotServerShutdownMsg),
46 RawJson(serde_json::Value),
48 Error(BinanceWsErrorMsg),
50 Reconnected,
52}
53
54#[allow(
56 missing_debug_implementations,
57 clippy::large_enum_variant,
58 reason = "Commands are ephemeral and immediately consumed"
59)]
60pub enum BinanceSpotPublicWsCommand {
61 SetClient(WebSocketClient),
63 Disconnect,
65 Subscribe { streams: Vec<String> },
67 Unsubscribe { streams: Vec<String> },
69}
70
71#[derive(Debug, Clone, Serialize)]
73pub struct BinanceWsSubscription {
74 pub method: BinanceWsMethod,
76 pub params: Vec<String>,
78 pub id: u64,
80}
81
82impl BinanceWsSubscription {
83 #[must_use]
85 pub fn subscribe(streams: Vec<String>, id: u64) -> Self {
86 Self {
87 method: BinanceWsMethod::Subscribe,
88 params: streams,
89 id,
90 }
91 }
92
93 #[must_use]
95 pub fn unsubscribe(streams: Vec<String>, id: u64) -> Self {
96 Self {
97 method: BinanceWsMethod::Unsubscribe,
98 params: streams,
99 id,
100 }
101 }
102}
103
104#[derive(Debug, Clone, Deserialize)]
106pub struct BinanceCombinedStreamEvent {
107 pub stream: String,
109 pub data: serde_json::Value,
111}
112
113#[derive(Debug, Clone, Deserialize)]
115pub struct BinanceSpotTradeMsg {
116 #[serde(rename = "e")]
118 pub event_type: String,
119 #[serde(rename = "E")]
121 pub event_time: i64,
122 #[serde(rename = "s")]
124 pub symbol: Ustr,
125 #[serde(rename = "t")]
127 pub trade_id: u64,
128 #[serde(rename = "p")]
130 pub price: String,
131 #[serde(rename = "q")]
133 pub quantity: String,
134 #[serde(rename = "T")]
136 pub trade_time: i64,
137 #[serde(rename = "m")]
139 pub is_buyer_maker: bool,
140}
141
142#[derive(Debug, Clone, Deserialize)]
144pub struct BinanceSpotBookTickerMsg {
145 #[serde(rename = "e", default)]
147 pub event_type: Option<String>,
148 #[serde(rename = "E", default)]
150 pub event_time: Option<i64>,
151 #[serde(rename = "s")]
153 pub symbol: Ustr,
154 #[serde(rename = "u")]
156 pub book_update_id: u64,
157 #[serde(rename = "b")]
159 pub best_bid_price: String,
160 #[serde(rename = "B")]
162 pub best_bid_qty: String,
163 #[serde(rename = "a")]
165 pub best_ask_price: String,
166 #[serde(rename = "A")]
168 pub best_ask_qty: String,
169 #[serde(rename = "T", default)]
171 pub transaction_time: Option<i64>,
172}
173
174#[derive(Debug, Clone)]
176pub struct BinanceSpotPartialDepthMsg {
177 pub symbol: Ustr,
179 pub last_update_id: u64,
181 pub bids: Vec<[String; 2]>,
183 pub asks: Vec<[String; 2]>,
185}
186
187#[derive(Debug, Clone, Deserialize)]
189pub struct BinanceSpotPartialDepthPayload {
190 #[serde(rename = "lastUpdateId")]
192 pub last_update_id: u64,
193 pub bids: Vec<[String; 2]>,
195 pub asks: Vec<[String; 2]>,
197}
198
199#[derive(Debug, Clone, Deserialize)]
201pub struct BinanceSpotDepthDiffMsg {
202 #[serde(rename = "e")]
204 pub event_type: String,
205 #[serde(rename = "E")]
207 pub event_time: i64,
208 #[serde(rename = "s")]
210 pub symbol: Ustr,
211 #[serde(rename = "U")]
213 pub first_update_id: u64,
214 #[serde(rename = "u")]
216 pub final_update_id: u64,
217 #[serde(rename = "b")]
219 pub bids: Vec<[String; 2]>,
220 #[serde(rename = "a")]
222 pub asks: Vec<[String; 2]>,
223}
224
225#[derive(Debug, Clone, Deserialize)]
227pub struct BinanceSpotKlineMsg {
228 #[serde(rename = "e")]
230 pub event_type: String,
231 #[serde(rename = "E")]
233 pub event_time: i64,
234 #[serde(rename = "s")]
236 pub symbol: Ustr,
237 #[serde(rename = "k")]
239 pub kline: BinanceSpotKlineData,
240}
241
242#[derive(Debug, Clone, Deserialize)]
244pub struct BinanceSpotKlineData {
245 #[serde(rename = "t")]
247 pub start_time: i64,
248 #[serde(rename = "T")]
250 pub close_time: i64,
251 #[serde(rename = "s")]
253 pub symbol: Ustr,
254 #[serde(rename = "i")]
256 pub interval: BinanceKlineInterval,
257 #[serde(rename = "f")]
259 pub first_trade_id: i64,
260 #[serde(rename = "L")]
262 pub last_trade_id: i64,
263 #[serde(rename = "o")]
265 pub open: String,
266 #[serde(rename = "c")]
268 pub close: String,
269 #[serde(rename = "h")]
271 pub high: String,
272 #[serde(rename = "l")]
274 pub low: String,
275 #[serde(rename = "v")]
277 pub volume: String,
278 #[serde(rename = "n")]
280 pub num_trades: i64,
281 #[serde(rename = "x")]
283 pub is_closed: bool,
284 #[serde(rename = "q")]
286 pub quote_volume: String,
287 #[serde(rename = "V")]
289 pub taker_buy_base_volume: String,
290 #[serde(rename = "Q")]
292 pub taker_buy_quote_volume: String,
293}
294
295#[derive(Debug, Clone, Deserialize)]
297pub struct BinanceSpotTickerMsg {
298 #[serde(rename = "E")]
299 pub event_time: i64,
300 #[serde(rename = "s")]
301 pub symbol: Ustr,
302 #[serde(rename = "p")]
303 pub price_change: String,
304 #[serde(rename = "P")]
305 pub price_change_percent: String,
306 #[serde(rename = "w")]
307 pub weighted_avg_price: String,
308 #[serde(rename = "x")]
309 pub prev_close_price: String,
310 #[serde(rename = "c")]
311 pub last_price: String,
312 #[serde(rename = "Q")]
313 pub last_qty: String,
314 #[serde(rename = "b")]
315 pub bid_price: String,
316 #[serde(rename = "B")]
317 pub bid_qty: String,
318 #[serde(rename = "a")]
319 pub ask_price: String,
320 #[serde(rename = "A")]
321 pub ask_qty: String,
322 #[serde(rename = "o")]
323 pub open_price: String,
324 #[serde(rename = "h")]
325 pub high_price: String,
326 #[serde(rename = "l")]
327 pub low_price: String,
328 #[serde(rename = "v")]
329 pub volume: String,
330 #[serde(rename = "q")]
331 pub quote_volume: String,
332 #[serde(rename = "O")]
333 pub open_time: i64,
334 #[serde(rename = "C")]
335 pub close_time: i64,
336 #[serde(rename = "F")]
337 pub first_trade_id: i64,
338 #[serde(rename = "L")]
339 pub last_trade_id: i64,
340 #[serde(rename = "n")]
341 pub num_trades: i64,
342}
343
344#[derive(Debug, Clone, Deserialize)]
346pub struct BinanceSpotServerShutdownMsg {
347 #[serde(rename = "e")]
349 pub event_type: String,
350 #[serde(rename = "E")]
352 pub event_time: i64,
353}
354
355pub type BinanceSpotWsResponse = BinanceWsResponse;
356pub type BinanceSpotWsErrorResponse = BinanceWsErrorResponse;