webull_rs/streaming/
events.rs

1use crate::models::market::Quote;
2use crate::models::order::Order;
3use serde::{Deserialize, Serialize};
4use chrono::{DateTime, Utc};
5
6/// Event types for WebSocket messages.
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8#[serde(rename_all = "UPPERCASE")]
9pub enum EventType {
10    /// Quote update event
11    Quote,
12    
13    /// Order update event
14    Order,
15    
16    /// Account update event
17    Account,
18    
19    /// Trade update event
20    Trade,
21    
22    /// Connection status event
23    Connection,
24    
25    /// Subscription status event
26    Subscription,
27    
28    /// Error event
29    Error,
30    
31    /// Heartbeat event
32    Heartbeat,
33    
34    /// Unknown event
35    Unknown,
36}
37
38/// WebSocket event.
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct Event {
41    /// Event type
42    #[serde(rename = "type")]
43    pub event_type: EventType,
44    
45    /// Event timestamp
46    pub timestamp: DateTime<Utc>,
47    
48    /// Event data
49    #[serde(flatten)]
50    pub data: EventData,
51}
52
53/// WebSocket event data.
54#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(untagged)]
56pub enum EventData {
57    /// Quote update event data
58    Quote(Quote),
59    
60    /// Order update event data
61    Order(Order),
62    
63    /// Connection status event data
64    Connection(ConnectionStatus),
65    
66    /// Subscription status event data
67    Subscription(SubscriptionStatus),
68    
69    /// Error event data
70    Error(ErrorEvent),
71    
72    /// Heartbeat event data
73    Heartbeat(HeartbeatEvent),
74    
75    /// Unknown event data
76    Unknown(serde_json::Value),
77}
78
79/// Connection status event data.
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ConnectionStatus {
82    /// Connection status
83    pub status: ConnectionState,
84    
85    /// Connection ID
86    pub connection_id: Option<String>,
87    
88    /// Connection message
89    pub message: Option<String>,
90}
91
92/// Connection state.
93#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
94#[serde(rename_all = "UPPERCASE")]
95pub enum ConnectionState {
96    /// Connected
97    Connected,
98    
99    /// Disconnected
100    Disconnected,
101    
102    /// Reconnecting
103    Reconnecting,
104    
105    /// Failed
106    Failed,
107}
108
109/// Subscription status event data.
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct SubscriptionStatus {
112    /// Subscription ID
113    pub subscription_id: String,
114    
115    /// Subscription status
116    pub status: SubscriptionState,
117    
118    /// Subscription message
119    pub message: Option<String>,
120}
121
122/// Subscription state.
123#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
124#[serde(rename_all = "UPPERCASE")]
125pub enum SubscriptionState {
126    /// Subscribed
127    Subscribed,
128    
129    /// Unsubscribed
130    Unsubscribed,
131    
132    /// Failed
133    Failed,
134}
135
136/// Error event data.
137#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct ErrorEvent {
139    /// Error code
140    pub code: String,
141    
142    /// Error message
143    pub message: String,
144}
145
146/// Heartbeat event data.
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct HeartbeatEvent {
149    /// Heartbeat ID
150    pub id: String,
151}