1use nautilus_core::UnixNanos;
17use serde::{Deserialize, Serialize};
18use strum::Display;
19use ustr::Ustr;
20
21use super::{OrderEvent, OrderEventType};
22use crate::{
23 events::{
24 OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated,
25 OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, OrderPendingCancel,
26 OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered,
27 OrderUpdated,
28 },
29 identifiers::{AccountId, ClientOrderId, InstrumentId, StrategyId, TraderId, VenueOrderId},
30};
31
32#[allow(clippy::large_enum_variant)] #[derive(Clone, PartialEq, Eq, Display, Debug, Serialize, Deserialize)]
35pub enum OrderEventAny {
36 Initialized(OrderInitialized),
37 Denied(OrderDenied),
38 Emulated(OrderEmulated),
39 Released(OrderReleased),
40 Submitted(OrderSubmitted),
41 Accepted(OrderAccepted),
42 Rejected(OrderRejected),
43 Canceled(OrderCanceled),
44 Expired(OrderExpired),
45 Triggered(OrderTriggered),
46 PendingUpdate(OrderPendingUpdate),
47 PendingCancel(OrderPendingCancel),
48 ModifyRejected(OrderModifyRejected),
49 CancelRejected(OrderCancelRejected),
50 Updated(OrderUpdated),
51 PartiallyFilled(OrderFilled),
52 Filled(OrderFilled),
53}
54
55impl OrderEventAny {
56 #[must_use]
57 pub fn into_boxed(self) -> Box<dyn OrderEvent> {
58 match self {
59 OrderEventAny::Initialized(event) => Box::new(event),
60 OrderEventAny::Denied(event) => Box::new(event),
61 OrderEventAny::Emulated(event) => Box::new(event),
62 OrderEventAny::Released(event) => Box::new(event),
63 OrderEventAny::Submitted(event) => Box::new(event),
64 OrderEventAny::Accepted(event) => Box::new(event),
65 OrderEventAny::Rejected(event) => Box::new(event),
66 OrderEventAny::Canceled(event) => Box::new(event),
67 OrderEventAny::Expired(event) => Box::new(event),
68 OrderEventAny::Triggered(event) => Box::new(event),
69 OrderEventAny::PendingUpdate(event) => Box::new(event),
70 OrderEventAny::PendingCancel(event) => Box::new(event),
71 OrderEventAny::ModifyRejected(event) => Box::new(event),
72 OrderEventAny::CancelRejected(event) => Box::new(event),
73 OrderEventAny::Updated(event) => Box::new(event),
74 OrderEventAny::PartiallyFilled(event) => Box::new(event),
75 OrderEventAny::Filled(event) => Box::new(event),
76 }
77 }
78
79 #[must_use]
80 pub fn event_type(&self) -> OrderEventType {
81 match self {
82 Self::Initialized(_) => OrderEventType::Initialized,
83 Self::Denied(_) => OrderEventType::Denied,
84 Self::Emulated(_) => OrderEventType::Emulated,
85 Self::Released(_) => OrderEventType::Released,
86 Self::Submitted(_) => OrderEventType::Submitted,
87 Self::Accepted(_) => OrderEventType::Accepted,
88 Self::Rejected(_) => OrderEventType::Rejected,
89 Self::Canceled(_) => OrderEventType::Canceled,
90 Self::Expired(_) => OrderEventType::Expired,
91 Self::Triggered(_) => OrderEventType::Triggered,
92 Self::PendingUpdate(_) => OrderEventType::PendingUpdate,
93 Self::PendingCancel(_) => OrderEventType::PendingCancel,
94 Self::ModifyRejected(_) => OrderEventType::ModifyRejected,
95 Self::CancelRejected(_) => OrderEventType::CancelRejected,
96 Self::Updated(_) => OrderEventType::Updated,
97 Self::PartiallyFilled(_) => OrderEventType::PartiallyFilled,
98 Self::Filled(_) => OrderEventType::Filled,
99 }
100 }
101
102 #[must_use]
103 pub fn trader_id(&self) -> TraderId {
104 match self {
105 Self::Initialized(event) => event.trader_id,
106 Self::Denied(event) => event.trader_id,
107 Self::Emulated(event) => event.trader_id,
108 Self::Released(event) => event.trader_id,
109 Self::Submitted(event) => event.trader_id,
110 Self::Accepted(event) => event.trader_id,
111 Self::Rejected(event) => event.trader_id,
112 Self::Canceled(event) => event.trader_id,
113 Self::Expired(event) => event.trader_id,
114 Self::Triggered(event) => event.trader_id,
115 Self::PendingUpdate(event) => event.trader_id,
116 Self::PendingCancel(event) => event.trader_id,
117 Self::ModifyRejected(event) => event.trader_id,
118 Self::CancelRejected(event) => event.trader_id,
119 Self::Updated(event) => event.trader_id,
120 Self::PartiallyFilled(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::PartiallyFilled(event) => event.client_order_id,
144 Self::Filled(event) => event.client_order_id,
145 }
146 }
147
148 #[must_use]
149 pub fn venue_order_id(&self) -> Option<VenueOrderId> {
150 match self {
151 Self::Initialized(event) => event.venue_order_id(),
152 Self::Denied(event) => event.venue_order_id(),
153 Self::Emulated(event) => event.venue_order_id(),
154 Self::Released(event) => event.venue_order_id(),
155 Self::Submitted(event) => event.venue_order_id(),
156 Self::Accepted(event) => event.venue_order_id(),
157 Self::Rejected(event) => event.venue_order_id(),
158 Self::Canceled(event) => event.venue_order_id(),
159 Self::Expired(event) => event.venue_order_id(),
160 Self::Triggered(event) => event.venue_order_id(),
161 Self::PendingUpdate(event) => event.venue_order_id(),
162 Self::PendingCancel(event) => event.venue_order_id(),
163 Self::ModifyRejected(event) => event.venue_order_id(),
164 Self::CancelRejected(event) => event.venue_order_id(),
165 Self::Updated(event) => event.venue_order_id(),
166 Self::PartiallyFilled(event) => event.venue_order_id(),
167 Self::Filled(event) => event.venue_order_id(),
168 }
169 }
170
171 #[must_use]
172 pub fn account_id(&self) -> Option<AccountId> {
173 match self {
174 Self::Initialized(event) => event.account_id(),
175 Self::Denied(event) => event.account_id(),
176 Self::Emulated(event) => event.account_id(),
177 Self::Released(event) => event.account_id(),
178 Self::Submitted(event) => event.account_id(),
179 Self::Accepted(event) => event.account_id(),
180 Self::Rejected(event) => event.account_id(),
181 Self::Canceled(event) => event.account_id(),
182 Self::Expired(event) => event.account_id(),
183 Self::Triggered(event) => event.account_id(),
184 Self::PendingUpdate(event) => event.account_id(),
185 Self::PendingCancel(event) => event.account_id(),
186 Self::ModifyRejected(event) => event.account_id(),
187 Self::CancelRejected(event) => event.account_id(),
188 Self::Updated(event) => event.account_id(),
189 Self::PartiallyFilled(event) => event.account_id(),
190 Self::Filled(event) => event.account_id(),
191 }
192 }
193
194 #[must_use]
195 pub fn instrument_id(&self) -> InstrumentId {
196 match self {
197 Self::Initialized(event) => event.instrument_id(),
198 Self::Denied(event) => event.instrument_id(),
199 Self::Emulated(event) => event.instrument_id(),
200 Self::Released(event) => event.instrument_id(),
201 Self::Submitted(event) => event.instrument_id(),
202 Self::Accepted(event) => event.instrument_id(),
203 Self::Rejected(event) => event.instrument_id(),
204 Self::Canceled(event) => event.instrument_id(),
205 Self::Expired(event) => event.instrument_id(),
206 Self::Triggered(event) => event.instrument_id(),
207 Self::PendingUpdate(event) => event.instrument_id(),
208 Self::PendingCancel(event) => event.instrument_id(),
209 Self::ModifyRejected(event) => event.instrument_id(),
210 Self::CancelRejected(event) => event.instrument_id(),
211 Self::Updated(event) => event.instrument_id(),
212 Self::PartiallyFilled(event) => event.instrument_id(),
213 Self::Filled(event) => event.instrument_id(),
214 }
215 }
216
217 #[must_use]
218 pub fn strategy_id(&self) -> StrategyId {
219 match self {
220 Self::Initialized(event) => event.strategy_id,
221 Self::Denied(event) => event.strategy_id,
222 Self::Emulated(event) => event.strategy_id,
223 Self::Released(event) => event.strategy_id,
224 Self::Submitted(event) => event.strategy_id,
225 Self::Accepted(event) => event.strategy_id,
226 Self::Rejected(event) => event.strategy_id,
227 Self::Canceled(event) => event.strategy_id,
228 Self::Expired(event) => event.strategy_id,
229 Self::Triggered(event) => event.strategy_id,
230 Self::PendingUpdate(event) => event.strategy_id,
231 Self::PendingCancel(event) => event.strategy_id,
232 Self::ModifyRejected(event) => event.strategy_id,
233 Self::CancelRejected(event) => event.strategy_id,
234 Self::Updated(event) => event.strategy_id,
235 Self::PartiallyFilled(event) => event.strategy_id,
236 Self::Filled(event) => event.strategy_id,
237 }
238 }
239
240 #[must_use]
241 pub fn ts_event(&self) -> UnixNanos {
242 match self {
243 Self::Initialized(event) => event.ts_event,
244 Self::Denied(event) => event.ts_event,
245 Self::Emulated(event) => event.ts_event,
246 Self::Released(event) => event.ts_event,
247 Self::Submitted(event) => event.ts_event,
248 Self::Accepted(event) => event.ts_event,
249 Self::Rejected(event) => event.ts_event,
250 Self::Canceled(event) => event.ts_event,
251 Self::Expired(event) => event.ts_event,
252 Self::Triggered(event) => event.ts_event,
253 Self::PendingUpdate(event) => event.ts_event,
254 Self::PendingCancel(event) => event.ts_event,
255 Self::ModifyRejected(event) => event.ts_event,
256 Self::CancelRejected(event) => event.ts_event,
257 Self::Updated(event) => event.ts_event,
258 Self::PartiallyFilled(event) => event.ts_event,
259 Self::Filled(event) => event.ts_event,
260 }
261 }
262
263 #[must_use]
264 pub fn message(&self) -> Option<Ustr> {
265 match self {
266 Self::Initialized(_) => None,
267 Self::Denied(event) => Some(event.reason),
268 Self::Emulated(_) => None,
269 Self::Released(_) => None,
270 Self::Submitted(_) => None,
271 Self::Accepted(_) => None,
272 Self::Rejected(event) => Some(event.reason),
273 Self::Canceled(_) => None,
274 Self::Expired(_) => None,
275 Self::Triggered(_) => None,
276 Self::PendingUpdate(_) => None,
277 Self::PendingCancel(_) => None,
278 Self::ModifyRejected(event) => Some(event.reason),
279 Self::CancelRejected(event) => Some(event.reason),
280 Self::Updated(_) => None,
281 Self::PartiallyFilled(_) => None,
282 Self::Filled(_) => None,
283 }
284 }
285}
286
287impl From<OrderEventAny> for OrderFilled {
288 fn from(event: OrderEventAny) -> OrderFilled {
289 match event {
290 OrderEventAny::Filled(event) => event,
291 _ => panic!("Invalid `OrderEventAny` not `OrderFilled`, was {:?}", event),
292 }
293 }
294}