1use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct MakerOrder {
10 pub order_id: String,
12 pub maker_address: String,
14 pub matched_amount: String,
16 pub fee_rate_bps: Option<String>,
18 pub asset_id: String,
20 pub price: String,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
26#[serde(rename_all = "UPPERCASE")]
27pub enum TradeStatus {
28 Matched,
30 Mined,
32 Confirmed,
34 Retrying,
36 Failed,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct TradeMessage {
43 pub event_type: String,
45 pub id: String,
47 pub asset_id: String,
49 pub market: String,
51 pub outcome: String,
53 pub price: String,
55 pub size: String,
57 pub side: String,
59 pub status: TradeStatus,
61 pub taker_order_id: String,
63 pub maker_orders: Vec<MakerOrder>,
65 pub owner: Option<String>,
67 pub transaction_hash: Option<String>,
69 pub timestamp: String,
71}
72
73#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
75#[serde(rename_all = "UPPERCASE")]
76pub enum OrderEventType {
77 Placement,
79 Update,
81 Cancellation,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct OrderMessage {
88 pub event_type: String,
90 pub id: String,
92 pub asset_id: String,
94 pub market: String,
96 pub outcome: String,
98 pub price: String,
100 pub side: String,
102 pub original_size: String,
104 pub size_matched: String,
106 #[serde(rename = "type")]
108 pub order_type: OrderEventType,
109 pub order_owner: Option<String>,
111 pub timestamp: String,
113}
114
115#[derive(Debug, Clone)]
117pub enum UserMessage {
118 Trade(TradeMessage),
120 Order(OrderMessage),
122}
123
124impl UserMessage {
125 pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
127 #[derive(Deserialize)]
128 struct RawMessage {
129 event_type: String,
130 }
131
132 let raw: RawMessage = serde_json::from_str(json)?;
133 match raw.event_type.as_str() {
134 "trade" => Ok(UserMessage::Trade(serde_json::from_str(json)?)),
135 "order" => Ok(UserMessage::Order(serde_json::from_str(json)?)),
136 _ => Err(serde::de::Error::custom(format!(
137 "Unknown user event type: {}",
138 raw.event_type
139 ))),
140 }
141 }
142}