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(clippy::large_enum_variant)]
35#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
36pub enum OrderEventAny {
37 Initialized(OrderInitialized),
38 Denied(OrderDenied),
39 Emulated(OrderEmulated),
40 Released(OrderReleased),
41 Submitted(OrderSubmitted),
42 Accepted(OrderAccepted),
43 Rejected(OrderRejected),
44 Canceled(OrderCanceled),
45 Expired(OrderExpired),
46 Triggered(OrderTriggered),
47 PendingUpdate(OrderPendingUpdate),
48 PendingCancel(OrderPendingCancel),
49 ModifyRejected(OrderModifyRejected),
50 CancelRejected(OrderCancelRejected),
51 Updated(OrderUpdated),
52 Filled(OrderFilled),
53}
54
55impl OrderEventAny {
56 #[must_use]
57 pub fn into_boxed(self) -> Box<dyn OrderEvent> {
58 match self {
59 Self::Initialized(event) => Box::new(event),
60 Self::Denied(event) => Box::new(event),
61 Self::Emulated(event) => Box::new(event),
62 Self::Released(event) => Box::new(event),
63 Self::Submitted(event) => Box::new(event),
64 Self::Accepted(event) => Box::new(event),
65 Self::Rejected(event) => Box::new(event),
66 Self::Canceled(event) => Box::new(event),
67 Self::Expired(event) => Box::new(event),
68 Self::Triggered(event) => Box::new(event),
69 Self::PendingUpdate(event) => Box::new(event),
70 Self::PendingCancel(event) => Box::new(event),
71 Self::ModifyRejected(event) => Box::new(event),
72 Self::CancelRejected(event) => Box::new(event),
73 Self::Updated(event) => Box::new(event),
74 Self::Filled(event) => Box::new(event),
75 }
76 }
77
78 #[must_use]
79 pub fn event_type(&self) -> OrderEventType {
80 match self {
81 Self::Initialized(_) => OrderEventType::Initialized,
82 Self::Denied(_) => OrderEventType::Denied,
83 Self::Emulated(_) => OrderEventType::Emulated,
84 Self::Released(_) => OrderEventType::Released,
85 Self::Submitted(_) => OrderEventType::Submitted,
86 Self::Accepted(_) => OrderEventType::Accepted,
87 Self::Rejected(_) => OrderEventType::Rejected,
88 Self::Canceled(_) => OrderEventType::Canceled,
89 Self::Expired(_) => OrderEventType::Expired,
90 Self::Triggered(_) => OrderEventType::Triggered,
91 Self::PendingUpdate(_) => OrderEventType::PendingUpdate,
92 Self::PendingCancel(_) => OrderEventType::PendingCancel,
93 Self::ModifyRejected(_) => OrderEventType::ModifyRejected,
94 Self::CancelRejected(_) => OrderEventType::CancelRejected,
95 Self::Updated(_) => OrderEventType::Updated,
96 Self::Filled(_) => OrderEventType::Filled,
97 }
98 }
99
100 #[must_use]
101 pub fn trader_id(&self) -> TraderId {
102 match self {
103 Self::Initialized(event) => event.trader_id,
104 Self::Denied(event) => event.trader_id,
105 Self::Emulated(event) => event.trader_id,
106 Self::Released(event) => event.trader_id,
107 Self::Submitted(event) => event.trader_id,
108 Self::Accepted(event) => event.trader_id,
109 Self::Rejected(event) => event.trader_id,
110 Self::Canceled(event) => event.trader_id,
111 Self::Expired(event) => event.trader_id,
112 Self::Triggered(event) => event.trader_id,
113 Self::PendingUpdate(event) => event.trader_id,
114 Self::PendingCancel(event) => event.trader_id,
115 Self::ModifyRejected(event) => event.trader_id,
116 Self::CancelRejected(event) => event.trader_id,
117 Self::Updated(event) => event.trader_id,
118 Self::Filled(event) => event.trader_id,
119 }
120 }
121
122 #[must_use]
123 pub fn client_order_id(&self) -> ClientOrderId {
124 match self {
125 Self::Initialized(event) => event.client_order_id,
126 Self::Denied(event) => event.client_order_id,
127 Self::Emulated(event) => event.client_order_id,
128 Self::Released(event) => event.client_order_id,
129 Self::Submitted(event) => event.client_order_id,
130 Self::Accepted(event) => event.client_order_id,
131 Self::Rejected(event) => event.client_order_id,
132 Self::Canceled(event) => event.client_order_id,
133 Self::Expired(event) => event.client_order_id,
134 Self::Triggered(event) => event.client_order_id,
135 Self::PendingUpdate(event) => event.client_order_id,
136 Self::PendingCancel(event) => event.client_order_id,
137 Self::ModifyRejected(event) => event.client_order_id,
138 Self::CancelRejected(event) => event.client_order_id,
139 Self::Updated(event) => event.client_order_id,
140 Self::Filled(event) => event.client_order_id,
141 }
142 }
143
144 #[must_use]
145 pub fn venue_order_id(&self) -> Option<VenueOrderId> {
146 match self {
147 Self::Initialized(event) => event.venue_order_id(),
148 Self::Denied(event) => event.venue_order_id(),
149 Self::Emulated(event) => event.venue_order_id(),
150 Self::Released(event) => event.venue_order_id(),
151 Self::Submitted(event) => event.venue_order_id(),
152 Self::Accepted(event) => event.venue_order_id(),
153 Self::Rejected(event) => event.venue_order_id(),
154 Self::Canceled(event) => event.venue_order_id(),
155 Self::Expired(event) => event.venue_order_id(),
156 Self::Triggered(event) => event.venue_order_id(),
157 Self::PendingUpdate(event) => event.venue_order_id(),
158 Self::PendingCancel(event) => event.venue_order_id(),
159 Self::ModifyRejected(event) => event.venue_order_id(),
160 Self::CancelRejected(event) => event.venue_order_id(),
161 Self::Updated(event) => event.venue_order_id(),
162 Self::Filled(event) => event.venue_order_id(),
163 }
164 }
165
166 #[must_use]
167 pub fn account_id(&self) -> Option<AccountId> {
168 match self {
169 Self::Initialized(event) => event.account_id(),
170 Self::Denied(event) => event.account_id(),
171 Self::Emulated(event) => event.account_id(),
172 Self::Released(event) => event.account_id(),
173 Self::Submitted(event) => event.account_id(),
174 Self::Accepted(event) => event.account_id(),
175 Self::Rejected(event) => event.account_id(),
176 Self::Canceled(event) => event.account_id(),
177 Self::Expired(event) => event.account_id(),
178 Self::Triggered(event) => event.account_id(),
179 Self::PendingUpdate(event) => event.account_id(),
180 Self::PendingCancel(event) => event.account_id(),
181 Self::ModifyRejected(event) => event.account_id(),
182 Self::CancelRejected(event) => event.account_id(),
183 Self::Updated(event) => event.account_id(),
184 Self::Filled(event) => event.account_id(),
185 }
186 }
187
188 #[must_use]
189 pub fn instrument_id(&self) -> InstrumentId {
190 match self {
191 Self::Initialized(event) => event.instrument_id(),
192 Self::Denied(event) => event.instrument_id(),
193 Self::Emulated(event) => event.instrument_id(),
194 Self::Released(event) => event.instrument_id(),
195 Self::Submitted(event) => event.instrument_id(),
196 Self::Accepted(event) => event.instrument_id(),
197 Self::Rejected(event) => event.instrument_id(),
198 Self::Canceled(event) => event.instrument_id(),
199 Self::Expired(event) => event.instrument_id(),
200 Self::Triggered(event) => event.instrument_id(),
201 Self::PendingUpdate(event) => event.instrument_id(),
202 Self::PendingCancel(event) => event.instrument_id(),
203 Self::ModifyRejected(event) => event.instrument_id(),
204 Self::CancelRejected(event) => event.instrument_id(),
205 Self::Updated(event) => event.instrument_id(),
206 Self::Filled(event) => event.instrument_id(),
207 }
208 }
209
210 #[must_use]
211 pub fn strategy_id(&self) -> StrategyId {
212 match self {
213 Self::Initialized(event) => event.strategy_id,
214 Self::Denied(event) => event.strategy_id,
215 Self::Emulated(event) => event.strategy_id,
216 Self::Released(event) => event.strategy_id,
217 Self::Submitted(event) => event.strategy_id,
218 Self::Accepted(event) => event.strategy_id,
219 Self::Rejected(event) => event.strategy_id,
220 Self::Canceled(event) => event.strategy_id,
221 Self::Expired(event) => event.strategy_id,
222 Self::Triggered(event) => event.strategy_id,
223 Self::PendingUpdate(event) => event.strategy_id,
224 Self::PendingCancel(event) => event.strategy_id,
225 Self::ModifyRejected(event) => event.strategy_id,
226 Self::CancelRejected(event) => event.strategy_id,
227 Self::Updated(event) => event.strategy_id,
228 Self::Filled(event) => event.strategy_id,
229 }
230 }
231
232 #[must_use]
233 pub fn ts_event(&self) -> UnixNanos {
234 match self {
235 Self::Initialized(event) => event.ts_event,
236 Self::Denied(event) => event.ts_event,
237 Self::Emulated(event) => event.ts_event,
238 Self::Released(event) => event.ts_event,
239 Self::Submitted(event) => event.ts_event,
240 Self::Accepted(event) => event.ts_event,
241 Self::Rejected(event) => event.ts_event,
242 Self::Canceled(event) => event.ts_event,
243 Self::Expired(event) => event.ts_event,
244 Self::Triggered(event) => event.ts_event,
245 Self::PendingUpdate(event) => event.ts_event,
246 Self::PendingCancel(event) => event.ts_event,
247 Self::ModifyRejected(event) => event.ts_event,
248 Self::CancelRejected(event) => event.ts_event,
249 Self::Updated(event) => event.ts_event,
250 Self::Filled(event) => event.ts_event,
251 }
252 }
253
254 #[must_use]
255 pub fn message(&self) -> Option<Ustr> {
256 match self {
257 Self::Initialized(_) => None,
258 Self::Denied(event) => Some(event.reason),
259 Self::Emulated(_) => None,
260 Self::Released(_) => None,
261 Self::Submitted(_) => None,
262 Self::Accepted(_) => None,
263 Self::Rejected(event) => Some(event.reason),
264 Self::Canceled(_) => None,
265 Self::Expired(_) => None,
266 Self::Triggered(_) => None,
267 Self::PendingUpdate(_) => None,
268 Self::PendingCancel(_) => None,
269 Self::ModifyRejected(event) => Some(event.reason),
270 Self::CancelRejected(event) => Some(event.reason),
271 Self::Updated(_) => None,
272 Self::Filled(_) => None,
273 }
274 }
275}
276
277impl From<OrderEventAny> for OrderFilled {
283 #[inline]
284 fn from(event: OrderEventAny) -> Self {
285 match event {
286 OrderEventAny::Filled(event) => event,
287 _ => panic!("Invalid `OrderEventAny` not `OrderFilled`, was {event:?}"),
288 }
289 }
290}
291
292impl Display for OrderEventAny {
293 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
294 match self {
295 Self::Initialized(e) => write!(f, "{e}"),
296 Self::Denied(e) => write!(f, "{e}"),
297 Self::Emulated(e) => write!(f, "{e}"),
298 Self::Released(e) => write!(f, "{e}"),
299 Self::Submitted(e) => write!(f, "{e}"),
300 Self::Accepted(e) => write!(f, "{e}"),
301 Self::Rejected(e) => write!(f, "{e}"),
302 Self::Canceled(e) => write!(f, "{e}"),
303 Self::Expired(e) => write!(f, "{e}"),
304 Self::Triggered(e) => write!(f, "{e}"),
305 Self::PendingUpdate(e) => write!(f, "{e}"),
306 Self::PendingCancel(e) => write!(f, "{e}"),
307 Self::ModifyRejected(e) => write!(f, "{e}"),
308 Self::CancelRejected(e) => write!(f, "{e}"),
309 Self::Updated(e) => write!(f, "{e}"),
310 Self::Filled(e) => write!(f, "{e}"),
311 }
312 }
313}