1use rust_decimal::Decimal;
2use serde::{Deserialize, Serialize};
3use strum::{Display, EnumString};
4
5use crate::order::{OrderStatus, Side};
6
7#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash)]
8#[strum(serialize_all = "PascalCase")]
9#[serde(rename_all = "PascalCase")]
10pub enum RfqExecutionMode {
11 #[default]
12 AwaitAccept,
13 Immediate,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct RequestForQuotePayload {
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub client_id: Option<u32>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub quantity: Option<Decimal>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub quote_quantity: Option<Decimal>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub price: Option<Decimal>,
27 pub symbol: String,
28 pub side: Side,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub execution_mode: Option<RfqExecutionMode>,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct QuotePayload {
36 pub rfq_id: String,
37 pub bid_price: Decimal,
38 pub ask_price: Decimal,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct RequestForQuoteStream {
43 pub stream: String,
44 pub data: RequestForQuoteUpdate,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(tag = "e", rename_all = "camelCase")] pub enum RequestForQuoteUpdate {
51 RfqActive {
52 #[serde(rename = "E")]
53 event_time: i64,
54 #[serde(rename = "R")]
55 rfq_id: u64,
56 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
57 client_id: Option<u32>,
58 #[serde(rename = "s")]
59 symbol: String,
60 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
61 quantity: Option<Decimal>,
62 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
63 quote_quantity: Option<Decimal>,
64 #[serde(rename = "w")]
65 submission_time: i64,
66 #[serde(rename = "W")]
67 expiry_time: i64,
68 #[serde(rename = "X")]
69 order_status: OrderStatus,
70 #[serde(rename = "T")]
71 timestamp: i64,
72 },
73 RfqRefreshed {
74 #[serde(rename = "E")]
75 event_time: i64,
76 #[serde(rename = "R")]
77 rfq_id: u64,
78 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
79 client_id: Option<u32>,
80 #[serde(rename = "s")]
81 symbol: String,
82 #[serde(rename = "S")]
83 side: Side,
84 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
85 quantity: Option<Decimal>,
86 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
87 quote_quantity: Option<Decimal>,
88 #[serde(rename = "w")]
89 submission_time: i64,
90 #[serde(rename = "W")]
91 expiry_time: i64,
92 #[serde(rename = "X")]
93 order_status: OrderStatus,
94 #[serde(rename = "T")]
95 timestamp: i64,
96 },
97 RfqAccepted {
98 #[serde(rename = "E")]
99 event_time: i64,
100 #[serde(rename = "R")]
101 rfq_id: u64,
102 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
103 client_id: Option<u32>,
104 #[serde(rename = "s")]
105 symbol: String,
106 #[serde(rename = "S")]
107 side: Side,
108 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
109 quantity: Option<Decimal>,
110 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
111 quote_quantity: Option<Decimal>,
112 #[serde(rename = "w")]
113 submission_time: i64,
114 #[serde(rename = "W")]
115 expiry_time: i64,
116 #[serde(rename = "X")]
117 order_status: OrderStatus,
118 #[serde(rename = "T")]
119 timestamp: i64,
120 },
121 RfqCancelled {
122 #[serde(rename = "E")]
123 event_time: i64,
124 #[serde(rename = "R")]
125 rfq_id: u64,
126 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
127 client_id: Option<u32>,
128 #[serde(rename = "s")]
129 symbol: String,
130 #[serde(rename = "S")]
131 side: Side,
132 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
133 quantity: Option<Decimal>,
134 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
135 quote_quantity: Option<Decimal>,
136 #[serde(rename = "w")]
137 submission_time: i64,
138 #[serde(rename = "W")]
139 expiry_time: i64,
140 #[serde(rename = "X")]
141 order_status: OrderStatus,
142 #[serde(rename = "T")]
143 timestamp: i64,
144 },
145 QuoteAccepted {
146 #[serde(rename = "E")]
147 event_time: i64,
148 #[serde(rename = "R")]
149 rfq_id: u64,
150 #[serde(rename = "u")]
151 quote_id: u64,
152 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
153 client_id: Option<u32>,
154 #[serde(rename = "s")]
155 symbol: String,
156 #[serde(rename = "p", skip_serializing_if = "Option::is_none")]
157 price: Option<Decimal>,
158 #[serde(rename = "X")]
159 order_status: OrderStatus,
160 #[serde(rename = "T")]
161 timestamp: i64,
162 },
163 QuoteCancelled {
164 #[serde(rename = "E")]
165 event_time: i64,
166 #[serde(rename = "R")]
167 rfq_id: u64,
168 #[serde(rename = "u")]
169 quote_id: u64,
170 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
171 client_id: Option<u32>,
172 #[serde(rename = "s")]
173 symbol: String,
174 #[serde(rename = "p", skip_serializing_if = "Option::is_none")]
175 price: Option<Decimal>,
176 #[serde(rename = "X")]
177 order_status: OrderStatus,
178 #[serde(rename = "T")]
179 timestamp: i64,
180 },
181 RfqCandidate {
182 #[serde(rename = "E")]
183 event_time: i64,
184 #[serde(rename = "R")]
185 rfq_id: u64,
186 #[serde(rename = "u")]
187 quote_id: u64,
188 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
189 client_id: Option<u32>,
190 #[serde(rename = "s")]
191 symbol: String,
192 #[serde(rename = "S", skip_serializing_if = "Option::is_none")]
193 side: Option<Side>,
194 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
195 quantity: Option<Decimal>,
196 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
197 quote_quantity: Option<Decimal>,
198 #[serde(rename = "p")]
199 price: Decimal,
200 #[serde(rename = "X")]
201 order_status: OrderStatus,
202 #[serde(rename = "T")]
203 timestamp: i64,
204 },
205 RfqFilled {
206 #[serde(rename = "E")]
207 event_time: i64,
208 #[serde(rename = "R")]
209 rfq_id: u64,
210 #[serde(rename = "u")]
211 quote_id: u64,
212 #[serde(rename = "C", skip_serializing_if = "Option::is_none")]
213 client_id: Option<u32>,
214 #[serde(rename = "s")]
215 symbol: String,
216 #[serde(rename = "S")]
217 side: Side,
218 #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
219 quantity: Option<Decimal>,
220 #[serde(rename = "Q", skip_serializing_if = "Option::is_none")]
221 quote_quantity: Option<Decimal>,
222 #[serde(rename = "p", skip_serializing_if = "Option::is_none")]
223 price: Option<Decimal>,
224 #[serde(rename = "X")]
225 order_status: OrderStatus,
226 #[serde(rename = "T")]
227 timestamp: i64,
228 },
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase")]
233pub struct Quote {
234 pub rfq_id: String,
235 pub quote_id: String,
236 pub client_id: Option<u32>,
237 pub status: OrderStatus,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize)]
241#[serde(rename_all = "camelCase")]
242pub struct RequestForQuote {
243 pub rfq_id: String,
244 pub client_id: Option<u32>,
245 pub symbol: String,
246 pub side: Side,
247 pub price: Option<Decimal>,
248 pub quantity: Option<Decimal>,
249 pub quote_quantity: Option<Decimal>,
250 pub submission_time: i64,
251 pub expiry_time: i64,
252 pub status: OrderStatus,
253 pub execution_mode: RfqExecutionMode,
254 pub created_at: i64,
255}