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, Serialize)]
117#[serde(untagged)]
118pub enum UserMessage {
119 Trade(TradeMessage),
121 Order(OrderMessage),
123}
124
125impl UserMessage {
126 pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
128 #[derive(Deserialize)]
129 struct RawMessage {
130 event_type: String,
131 }
132
133 let raw: RawMessage = serde_json::from_str(json)?;
134 match raw.event_type.as_str() {
135 "trade" => Ok(UserMessage::Trade(serde_json::from_str(json)?)),
136 "order" => Ok(UserMessage::Order(serde_json::from_str(json)?)),
137 _ => Err(serde::de::Error::custom(format!(
138 "Unknown user event type: {}",
139 raw.event_type
140 ))),
141 }
142 }
143}