use crate::models::market::Quote;
use crate::models::order::Order;
use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum EventType {
Quote,
Order,
Account,
Trade,
Connection,
Subscription,
Error,
Heartbeat,
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
#[serde(rename = "type")]
pub event_type: EventType,
pub timestamp: DateTime<Utc>,
#[serde(flatten)]
pub data: EventData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum EventData {
Quote(Quote),
Order(Order),
Connection(ConnectionStatus),
Subscription(SubscriptionStatus),
Error(ErrorEvent),
Heartbeat(HeartbeatEvent),
Unknown(serde_json::Value),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionStatus {
pub status: ConnectionState,
pub connection_id: Option<String>,
pub message: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum ConnectionState {
Connected,
Disconnected,
Reconnecting,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscriptionStatus {
pub subscription_id: String,
pub status: SubscriptionState,
pub message: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum SubscriptionState {
Subscribed,
Unsubscribed,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorEvent {
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeartbeatEvent {
pub id: String,
}