webull_rs/streaming/
events.rs

1use crate::models::market::Quote;
2use crate::models::order::Order;
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
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}