nautilus_model/events/order/
any.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use 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/// Wraps an `OrderEvent` allowing polymorphism.
33#[allow(clippy::large_enum_variant)] // TODO fix
34#[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}