bpx_api_types/
rfq.rs

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/// RequestForQuote updates received from the websocket.
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(tag = "e", rename_all = "camelCase")] // Discriminates based on "e" field
50pub 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}