webull_rs/streaming/
events.rs1use crate::models::market::Quote;
2use crate::models::order::Order;
3use serde::{Deserialize, Serialize};
4use chrono::{DateTime, Utc};
5
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
8#[serde(rename_all = "UPPERCASE")]
9pub enum EventType {
10 Quote,
12
13 Order,
15
16 Account,
18
19 Trade,
21
22 Connection,
24
25 Subscription,
27
28 Error,
30
31 Heartbeat,
33
34 Unknown,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct Event {
41 #[serde(rename = "type")]
43 pub event_type: EventType,
44
45 pub timestamp: DateTime<Utc>,
47
48 #[serde(flatten)]
50 pub data: EventData,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(untagged)]
56pub enum EventData {
57 Quote(Quote),
59
60 Order(Order),
62
63 Connection(ConnectionStatus),
65
66 Subscription(SubscriptionStatus),
68
69 Error(ErrorEvent),
71
72 Heartbeat(HeartbeatEvent),
74
75 Unknown(serde_json::Value),
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ConnectionStatus {
82 pub status: ConnectionState,
84
85 pub connection_id: Option<String>,
87
88 pub message: Option<String>,
90}
91
92#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
94#[serde(rename_all = "UPPERCASE")]
95pub enum ConnectionState {
96 Connected,
98
99 Disconnected,
101
102 Reconnecting,
104
105 Failed,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct SubscriptionStatus {
112 pub subscription_id: String,
114
115 pub status: SubscriptionState,
117
118 pub message: Option<String>,
120}
121
122#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
124#[serde(rename_all = "UPPERCASE")]
125pub enum SubscriptionState {
126 Subscribed,
128
129 Unsubscribed,
131
132 Failed,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
138pub struct ErrorEvent {
139 pub code: String,
141
142 pub message: String,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct HeartbeatEvent {
149 pub id: String,
151}