Skip to main content

nautilus_model/python/events/order/
mod.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 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::python::to_pyvalue_err;
17use pyo3::{IntoPyObjectExt, Py, PyAny, PyResult, Python};
18
19use crate::events::{
20    OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated, OrderEventAny,
21    OrderExpired, OrderFillVoided, OrderFilled, OrderInitialized, OrderModifyRejected,
22    OrderPendingCancel, OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted,
23    OrderTriggered, OrderUpdated,
24};
25
26pub mod accepted;
27pub mod cancel_rejected;
28pub mod canceled;
29pub mod denied;
30pub mod emulated;
31pub mod expired;
32pub mod fill_voided;
33pub mod filled;
34pub mod initialized;
35pub mod modify_rejected;
36pub mod pending_cancel;
37pub mod pending_update;
38pub mod rejected;
39pub mod released;
40pub mod snapshot;
41pub mod submitted;
42pub mod triggered;
43pub mod updated;
44
45/// Converts an [`OrderEventAny`] into a Python object.
46///
47/// # Errors
48///
49/// Returns a `PyErr` if conversion to a Python object fails.
50pub fn order_event_to_pyobject(py: Python, order_event: OrderEventAny) -> PyResult<Py<PyAny>> {
51    match order_event {
52        OrderEventAny::Initialized(event) => event.into_py_any(py),
53        OrderEventAny::Denied(event) => event.into_py_any(py),
54        OrderEventAny::Emulated(event) => event.into_py_any(py),
55        OrderEventAny::Released(event) => event.into_py_any(py),
56        OrderEventAny::Submitted(event) => event.into_py_any(py),
57        OrderEventAny::Accepted(event) => event.into_py_any(py),
58        OrderEventAny::Rejected(event) => event.into_py_any(py),
59        OrderEventAny::Canceled(event) => event.into_py_any(py),
60        OrderEventAny::Expired(event) => event.into_py_any(py),
61        OrderEventAny::Triggered(event) => event.into_py_any(py),
62        OrderEventAny::PendingUpdate(event) => event.into_py_any(py),
63        OrderEventAny::PendingCancel(event) => event.into_py_any(py),
64        OrderEventAny::ModifyRejected(event) => event.into_py_any(py),
65        OrderEventAny::CancelRejected(event) => event.into_py_any(py),
66        OrderEventAny::Updated(event) => event.into_py_any(py),
67        OrderEventAny::Filled(event) => event.into_py_any(py),
68        OrderEventAny::FillVoided(event) => event.into_py_any(py),
69    }
70}
71
72/// Converts a Python object into an [`OrderEventAny`] enum.
73///
74/// # Errors
75///
76/// Returns a `PyErr` if extraction fails or the event type is unsupported.
77#[expect(clippy::needless_pass_by_value)]
78pub fn pyobject_to_order_event(py: Python, order_event: Py<PyAny>) -> PyResult<OrderEventAny> {
79    let class = order_event.getattr(py, "__class__")?;
80    match class.getattr(py, "__name__")?.extract::<&str>(py)? {
81        stringify!(OrderAccepted) => Ok(OrderEventAny::Accepted(
82            order_event.extract::<OrderAccepted>(py)?,
83        )),
84        stringify!(OrderCancelRejected) => Ok(OrderEventAny::CancelRejected(
85            order_event.extract::<OrderCancelRejected>(py)?,
86        )),
87        stringify!(OrderCanceled) => Ok(OrderEventAny::Canceled(
88            order_event.extract::<OrderCanceled>(py)?,
89        )),
90        stringify!(OrderDenied) => Ok(OrderEventAny::Denied(
91            order_event.extract::<OrderDenied>(py)?,
92        )),
93        stringify!(OrderEmulated) => Ok(OrderEventAny::Emulated(
94            order_event.extract::<OrderEmulated>(py)?,
95        )),
96        stringify!(OrderExpired) => Ok(OrderEventAny::Expired(
97            order_event.extract::<OrderExpired>(py)?,
98        )),
99        stringify!(OrderFilled) => Ok(OrderEventAny::Filled(
100            order_event.extract::<OrderFilled>(py)?,
101        )),
102        stringify!(OrderFillVoided) => Ok(OrderEventAny::FillVoided(
103            order_event.extract::<OrderFillVoided>(py)?,
104        )),
105        stringify!(OrderInitialized) => Ok(OrderEventAny::Initialized(
106            order_event.extract::<OrderInitialized>(py)?,
107        )),
108        stringify!(OrderModifyRejected) => Ok(OrderEventAny::ModifyRejected(
109            order_event.extract::<OrderModifyRejected>(py)?,
110        )),
111        stringify!(OrderPendingCancel) => Ok(OrderEventAny::PendingCancel(
112            order_event.extract::<OrderPendingCancel>(py)?,
113        )),
114        stringify!(OrderPendingUpdate) => Ok(OrderEventAny::PendingUpdate(
115            order_event.extract::<OrderPendingUpdate>(py)?,
116        )),
117        stringify!(OrderRejected) => Ok(OrderEventAny::Rejected(
118            order_event.extract::<OrderRejected>(py)?,
119        )),
120        stringify!(OrderReleased) => Ok(OrderEventAny::Released(
121            order_event.extract::<OrderReleased>(py)?,
122        )),
123        stringify!(OrderSubmitted) => Ok(OrderEventAny::Submitted(
124            order_event.extract::<OrderSubmitted>(py)?,
125        )),
126        stringify!(OrderTriggered) => Ok(OrderEventAny::Triggered(
127            order_event.extract::<OrderTriggered>(py)?,
128        )),
129        stringify!(OrderUpdated) => Ok(OrderEventAny::Updated(
130            order_event.extract::<OrderUpdated>(py)?,
131        )),
132        _ => Err(to_pyvalue_err(
133            "Error in conversion from `Py<PyAny>` to `OrderEventAny`",
134        )),
135    }
136}