1use std::fmt::Display;
17
18use nautilus_core::UnixNanos;
19use serde::{Deserialize, Serialize};
20use ustr::Ustr;
21
22use super::{OrderEvent, OrderEventType};
23use crate::{
24 events::{
25 OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated,
26 OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, OrderPendingCancel,
27 OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered,
28 OrderUpdated,
29 },
30 identifiers::{AccountId, ClientOrderId, InstrumentId, StrategyId, TraderId, VenueOrderId},
31};
32
33#[allow(
35 clippy::large_enum_variant,
36 reason = "lint fires only with high-precision feature"
37)]
38#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
39pub enum OrderEventAny {
40 Initialized(OrderInitialized),
41 Denied(OrderDenied),
42 Emulated(OrderEmulated),
43 Released(OrderReleased),
44 Submitted(OrderSubmitted),
45 Accepted(OrderAccepted),
46 Rejected(OrderRejected),
47 Canceled(OrderCanceled),
48 Expired(OrderExpired),
49 Triggered(OrderTriggered),
50 PendingUpdate(OrderPendingUpdate),
51 PendingCancel(OrderPendingCancel),
52 ModifyRejected(OrderModifyRejected),
53 CancelRejected(OrderCancelRejected),
54 Updated(OrderUpdated),
55 Filled(OrderFilled),
56}
57
58impl OrderEventAny {
59 #[must_use]
60 pub fn into_boxed(self) -> Box<dyn OrderEvent> {
61 match self {
62 Self::Initialized(event) => Box::new(event),
63 Self::Denied(event) => Box::new(event),
64 Self::Emulated(event) => Box::new(event),
65 Self::Released(event) => Box::new(event),
66 Self::Submitted(event) => Box::new(event),
67 Self::Accepted(event) => Box::new(event),
68 Self::Rejected(event) => Box::new(event),
69 Self::Canceled(event) => Box::new(event),
70 Self::Expired(event) => Box::new(event),
71 Self::Triggered(event) => Box::new(event),
72 Self::PendingUpdate(event) => Box::new(event),
73 Self::PendingCancel(event) => Box::new(event),
74 Self::ModifyRejected(event) => Box::new(event),
75 Self::CancelRejected(event) => Box::new(event),
76 Self::Updated(event) => Box::new(event),
77 Self::Filled(event) => Box::new(event),
78 }
79 }
80
81 #[must_use]
82 pub fn event_type(&self) -> OrderEventType {
83 match self {
84 Self::Initialized(_) => OrderEventType::Initialized,
85 Self::Denied(_) => OrderEventType::Denied,
86 Self::Emulated(_) => OrderEventType::Emulated,
87 Self::Released(_) => OrderEventType::Released,
88 Self::Submitted(_) => OrderEventType::Submitted,
89 Self::Accepted(_) => OrderEventType::Accepted,
90 Self::Rejected(_) => OrderEventType::Rejected,
91 Self::Canceled(_) => OrderEventType::Canceled,
92 Self::Expired(_) => OrderEventType::Expired,
93 Self::Triggered(_) => OrderEventType::Triggered,
94 Self::PendingUpdate(_) => OrderEventType::PendingUpdate,
95 Self::PendingCancel(_) => OrderEventType::PendingCancel,
96 Self::ModifyRejected(_) => OrderEventType::ModifyRejected,
97 Self::CancelRejected(_) => OrderEventType::CancelRejected,
98 Self::Updated(_) => OrderEventType::Updated,
99 Self::Filled(_) => OrderEventType::Filled,
100 }
101 }
102
103 #[must_use]
104 pub fn trader_id(&self) -> TraderId {
105 match self {
106 Self::Initialized(event) => event.trader_id,
107 Self::Denied(event) => event.trader_id,
108 Self::Emulated(event) => event.trader_id,
109 Self::Released(event) => event.trader_id,
110 Self::Submitted(event) => event.trader_id,
111 Self::Accepted(event) => event.trader_id,
112 Self::Rejected(event) => event.trader_id,
113 Self::Canceled(event) => event.trader_id,
114 Self::Expired(event) => event.trader_id,
115 Self::Triggered(event) => event.trader_id,
116 Self::PendingUpdate(event) => event.trader_id,
117 Self::PendingCancel(event) => event.trader_id,
118 Self::ModifyRejected(event) => event.trader_id,
119 Self::CancelRejected(event) => event.trader_id,
120 Self::Updated(event) => event.trader_id,
121 Self::Filled(event) => event.trader_id,
122 }
123 }
124
125 #[must_use]
126 pub fn client_order_id(&self) -> ClientOrderId {
127 match self {
128 Self::Initialized(event) => event.client_order_id,
129 Self::Denied(event) => event.client_order_id,
130 Self::Emulated(event) => event.client_order_id,
131 Self::Released(event) => event.client_order_id,
132 Self::Submitted(event) => event.client_order_id,
133 Self::Accepted(event) => event.client_order_id,
134 Self::Rejected(event) => event.client_order_id,
135 Self::Canceled(event) => event.client_order_id,
136 Self::Expired(event) => event.client_order_id,
137 Self::Triggered(event) => event.client_order_id,
138 Self::PendingUpdate(event) => event.client_order_id,
139 Self::PendingCancel(event) => event.client_order_id,
140 Self::ModifyRejected(event) => event.client_order_id,
141 Self::CancelRejected(event) => event.client_order_id,
142 Self::Updated(event) => event.client_order_id,
143 Self::Filled(event) => event.client_order_id,
144 }
145 }
146
147 #[must_use]
148 pub fn with_client_order_id(mut self, client_order_id: ClientOrderId) -> Self {
149 match &mut self {
150 Self::Initialized(event) => event.client_order_id = client_order_id,
151 Self::Denied(event) => event.client_order_id = client_order_id,
152 Self::Emulated(event) => event.client_order_id = client_order_id,
153 Self::Released(event) => event.client_order_id = client_order_id,
154 Self::Submitted(event) => event.client_order_id = client_order_id,
155 Self::Accepted(event) => event.client_order_id = client_order_id,
156 Self::Rejected(event) => event.client_order_id = client_order_id,
157 Self::Canceled(event) => event.client_order_id = client_order_id,
158 Self::Expired(event) => event.client_order_id = client_order_id,
159 Self::Triggered(event) => event.client_order_id = client_order_id,
160 Self::PendingUpdate(event) => event.client_order_id = client_order_id,
161 Self::PendingCancel(event) => event.client_order_id = client_order_id,
162 Self::ModifyRejected(event) => event.client_order_id = client_order_id,
163 Self::CancelRejected(event) => event.client_order_id = client_order_id,
164 Self::Updated(event) => event.client_order_id = client_order_id,
165 Self::Filled(event) => event.client_order_id = client_order_id,
166 }
167
168 self
169 }
170
171 #[must_use]
172 pub fn venue_order_id(&self) -> Option<VenueOrderId> {
173 match self {
174 Self::Initialized(event) => event.venue_order_id(),
175 Self::Denied(event) => event.venue_order_id(),
176 Self::Emulated(event) => event.venue_order_id(),
177 Self::Released(event) => event.venue_order_id(),
178 Self::Submitted(event) => event.venue_order_id(),
179 Self::Accepted(event) => event.venue_order_id(),
180 Self::Rejected(event) => event.venue_order_id(),
181 Self::Canceled(event) => event.venue_order_id(),
182 Self::Expired(event) => event.venue_order_id(),
183 Self::Triggered(event) => event.venue_order_id(),
184 Self::PendingUpdate(event) => event.venue_order_id(),
185 Self::PendingCancel(event) => event.venue_order_id(),
186 Self::ModifyRejected(event) => event.venue_order_id(),
187 Self::CancelRejected(event) => event.venue_order_id(),
188 Self::Updated(event) => event.venue_order_id(),
189 Self::Filled(event) => event.venue_order_id(),
190 }
191 }
192
193 #[must_use]
194 pub fn account_id(&self) -> Option<AccountId> {
195 match self {
196 Self::Initialized(event) => event.account_id(),
197 Self::Denied(event) => event.account_id(),
198 Self::Emulated(event) => event.account_id(),
199 Self::Released(event) => event.account_id(),
200 Self::Submitted(event) => event.account_id(),
201 Self::Accepted(event) => event.account_id(),
202 Self::Rejected(event) => event.account_id(),
203 Self::Canceled(event) => event.account_id(),
204 Self::Expired(event) => event.account_id(),
205 Self::Triggered(event) => event.account_id(),
206 Self::PendingUpdate(event) => event.account_id(),
207 Self::PendingCancel(event) => event.account_id(),
208 Self::ModifyRejected(event) => event.account_id(),
209 Self::CancelRejected(event) => event.account_id(),
210 Self::Updated(event) => event.account_id(),
211 Self::Filled(event) => event.account_id(),
212 }
213 }
214
215 #[must_use]
216 pub fn instrument_id(&self) -> InstrumentId {
217 match self {
218 Self::Initialized(event) => event.instrument_id(),
219 Self::Denied(event) => event.instrument_id(),
220 Self::Emulated(event) => event.instrument_id(),
221 Self::Released(event) => event.instrument_id(),
222 Self::Submitted(event) => event.instrument_id(),
223 Self::Accepted(event) => event.instrument_id(),
224 Self::Rejected(event) => event.instrument_id(),
225 Self::Canceled(event) => event.instrument_id(),
226 Self::Expired(event) => event.instrument_id(),
227 Self::Triggered(event) => event.instrument_id(),
228 Self::PendingUpdate(event) => event.instrument_id(),
229 Self::PendingCancel(event) => event.instrument_id(),
230 Self::ModifyRejected(event) => event.instrument_id(),
231 Self::CancelRejected(event) => event.instrument_id(),
232 Self::Updated(event) => event.instrument_id(),
233 Self::Filled(event) => event.instrument_id(),
234 }
235 }
236
237 #[must_use]
238 pub fn strategy_id(&self) -> StrategyId {
239 match self {
240 Self::Initialized(event) => event.strategy_id,
241 Self::Denied(event) => event.strategy_id,
242 Self::Emulated(event) => event.strategy_id,
243 Self::Released(event) => event.strategy_id,
244 Self::Submitted(event) => event.strategy_id,
245 Self::Accepted(event) => event.strategy_id,
246 Self::Rejected(event) => event.strategy_id,
247 Self::Canceled(event) => event.strategy_id,
248 Self::Expired(event) => event.strategy_id,
249 Self::Triggered(event) => event.strategy_id,
250 Self::PendingUpdate(event) => event.strategy_id,
251 Self::PendingCancel(event) => event.strategy_id,
252 Self::ModifyRejected(event) => event.strategy_id,
253 Self::CancelRejected(event) => event.strategy_id,
254 Self::Updated(event) => event.strategy_id,
255 Self::Filled(event) => event.strategy_id,
256 }
257 }
258
259 #[must_use]
260 pub fn ts_event(&self) -> UnixNanos {
261 match self {
262 Self::Initialized(event) => event.ts_event,
263 Self::Denied(event) => event.ts_event,
264 Self::Emulated(event) => event.ts_event,
265 Self::Released(event) => event.ts_event,
266 Self::Submitted(event) => event.ts_event,
267 Self::Accepted(event) => event.ts_event,
268 Self::Rejected(event) => event.ts_event,
269 Self::Canceled(event) => event.ts_event,
270 Self::Expired(event) => event.ts_event,
271 Self::Triggered(event) => event.ts_event,
272 Self::PendingUpdate(event) => event.ts_event,
273 Self::PendingCancel(event) => event.ts_event,
274 Self::ModifyRejected(event) => event.ts_event,
275 Self::CancelRejected(event) => event.ts_event,
276 Self::Updated(event) => event.ts_event,
277 Self::Filled(event) => event.ts_event,
278 }
279 }
280
281 #[must_use]
282 pub fn message(&self) -> Option<Ustr> {
283 match self {
284 Self::Initialized(_) => None,
285 Self::Denied(event) => Some(event.reason),
286 Self::Emulated(_) => None,
287 Self::Released(_) => None,
288 Self::Submitted(_) => None,
289 Self::Accepted(_) => None,
290 Self::Rejected(event) => Some(event.reason),
291 Self::Canceled(_) => None,
292 Self::Expired(_) => None,
293 Self::Triggered(_) => None,
294 Self::PendingUpdate(_) => None,
295 Self::PendingCancel(_) => None,
296 Self::ModifyRejected(event) => Some(event.reason),
297 Self::CancelRejected(event) => Some(event.reason),
298 Self::Updated(_) => None,
299 Self::Filled(_) => None,
300 }
301 }
302}
303
304impl From<OrderEventAny> for OrderFilled {
310 #[inline]
311 fn from(event: OrderEventAny) -> Self {
312 match event {
313 OrderEventAny::Filled(event) => event,
314 _ => panic!("Invalid `OrderEventAny` not `OrderFilled`, was {event:?}"),
315 }
316 }
317}
318
319impl Display for OrderEventAny {
320 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
321 match self {
322 Self::Initialized(e) => write!(f, "{e}"),
323 Self::Denied(e) => write!(f, "{e}"),
324 Self::Emulated(e) => write!(f, "{e}"),
325 Self::Released(e) => write!(f, "{e}"),
326 Self::Submitted(e) => write!(f, "{e}"),
327 Self::Accepted(e) => write!(f, "{e}"),
328 Self::Rejected(e) => write!(f, "{e}"),
329 Self::Canceled(e) => write!(f, "{e}"),
330 Self::Expired(e) => write!(f, "{e}"),
331 Self::Triggered(e) => write!(f, "{e}"),
332 Self::PendingUpdate(e) => write!(f, "{e}"),
333 Self::PendingCancel(e) => write!(f, "{e}"),
334 Self::ModifyRejected(e) => write!(f, "{e}"),
335 Self::CancelRejected(e) => write!(f, "{e}"),
336 Self::Updated(e) => write!(f, "{e}"),
337 Self::Filled(e) => write!(f, "{e}"),
338 }
339 }
340}
341
342#[cfg(test)]
343mod tests {
344 use rstest::rstest;
345
346 use super::OrderEventAny;
347 use crate::events::{OrderAccepted, OrderFilled, order::stubs::*};
348
349 #[rstest]
350 fn test_from_order_event_any_to_filled(order_filled: OrderFilled) {
351 let expected_trade_id = order_filled.trade_id;
352 let event = OrderEventAny::Filled(order_filled);
353 let filled: OrderFilled = event.into();
354 assert_eq!(filled.trade_id, expected_trade_id);
355 }
356
357 #[rstest]
358 #[should_panic(expected = "Invalid `OrderEventAny` not `OrderFilled`")]
359 fn test_from_order_event_any_to_filled_panics_on_wrong_variant(order_accepted: OrderAccepted) {
360 let event = OrderEventAny::Accepted(order_accepted);
361 let _filled: OrderFilled = event.into();
362 }
363
364 #[rstest]
365 fn test_display_delegates_to_inner(order_filled: OrderFilled) {
366 let inner_display = format!("{order_filled}");
367 let event = OrderEventAny::Filled(order_filled);
368 assert_eq!(format!("{event}"), inner_display);
369 }
370}