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 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/// Wraps an `OrderEvent` allowing polymorphism.
34#[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
277/// Converts an `OrderEventAny` into an `OrderFilled`.
278///
279/// # Panics
280///
281/// Panics if `event` is not a `Filled` variant.
282impl 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}