nautilus_model/python/events/order/
mod.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::python::{IntoPyObjectNautilusExt, to_pyvalue_err};
17use pyo3::{PyObject, PyResult, Python};
18
19use crate::events::{
20    OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated, OrderEventAny,
21    OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, OrderPendingCancel,
22    OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered, OrderUpdated,
23};
24
25pub mod accepted;
26pub mod cancel_rejected;
27pub mod canceled;
28pub mod denied;
29pub mod emulated;
30pub mod expired;
31pub mod filled;
32pub mod initialized;
33pub mod modify_rejected;
34pub mod pending_cancel;
35pub mod pending_update;
36pub mod rejected;
37pub mod released;
38pub mod snapshot;
39pub mod submitted;
40pub mod triggered;
41pub mod updated;
42
43pub fn order_event_to_pyobject(py: Python, order_event: OrderEventAny) -> PyResult<PyObject> {
44    match order_event {
45        OrderEventAny::Initialized(event) => Ok(event.into_py_any_unwrap(py)),
46        OrderEventAny::Denied(event) => Ok(event.into_py_any_unwrap(py)),
47        OrderEventAny::Emulated(event) => Ok(event.into_py_any_unwrap(py)),
48        OrderEventAny::Released(event) => Ok(event.into_py_any_unwrap(py)),
49        OrderEventAny::Submitted(event) => Ok(event.into_py_any_unwrap(py)),
50        OrderEventAny::Accepted(event) => Ok(event.into_py_any_unwrap(py)),
51        OrderEventAny::Rejected(event) => Ok(event.into_py_any_unwrap(py)),
52        OrderEventAny::Canceled(event) => Ok(event.into_py_any_unwrap(py)),
53        OrderEventAny::Expired(event) => Ok(event.into_py_any_unwrap(py)),
54        OrderEventAny::Triggered(event) => Ok(event.into_py_any_unwrap(py)),
55        OrderEventAny::PendingUpdate(event) => Ok(event.into_py_any_unwrap(py)),
56        OrderEventAny::PendingCancel(event) => Ok(event.into_py_any_unwrap(py)),
57        OrderEventAny::ModifyRejected(event) => Ok(event.into_py_any_unwrap(py)),
58        OrderEventAny::CancelRejected(event) => Ok(event.into_py_any_unwrap(py)),
59        OrderEventAny::Updated(event) => Ok(event.into_py_any_unwrap(py)),
60        OrderEventAny::Filled(event) => Ok(event.into_py_any_unwrap(py)),
61    }
62}
63
64pub fn pyobject_to_order_event(py: Python, order_event: PyObject) -> PyResult<OrderEventAny> {
65    let class = order_event.getattr(py, "__class__")?;
66    match class.getattr(py, "__name__")?.extract::<&str>(py)? {
67        stringify!(OrderAccepted) => Ok(OrderEventAny::Accepted(
68            order_event.extract::<OrderAccepted>(py)?,
69        )),
70        stringify!(OrderCancelRejected) => Ok(OrderEventAny::CancelRejected(
71            order_event.extract::<OrderCancelRejected>(py)?,
72        )),
73        stringify!(OrderCanceled) => Ok(OrderEventAny::Canceled(
74            order_event.extract::<OrderCanceled>(py)?,
75        )),
76        stringify!(OrderDenied) => Ok(OrderEventAny::Denied(
77            order_event.extract::<OrderDenied>(py)?,
78        )),
79        stringify!(OrderEmulated) => Ok(OrderEventAny::Emulated(
80            order_event.extract::<OrderEmulated>(py)?,
81        )),
82        stringify!(OrderExpired) => Ok(OrderEventAny::Expired(
83            order_event.extract::<OrderExpired>(py)?,
84        )),
85        stringify!(OrderFilled) => Ok(OrderEventAny::Filled(
86            order_event.extract::<OrderFilled>(py)?,
87        )),
88        stringify!(OrderInitialized) => Ok(OrderEventAny::Initialized(
89            order_event.extract::<OrderInitialized>(py)?,
90        )),
91        stringify!(OrderModifyRejected) => Ok(OrderEventAny::ModifyRejected(
92            order_event.extract::<OrderModifyRejected>(py)?,
93        )),
94        stringify!(OrderPendingCancel) => Ok(OrderEventAny::PendingCancel(
95            order_event.extract::<OrderPendingCancel>(py)?,
96        )),
97        stringify!(OrderPendingUpdate) => Ok(OrderEventAny::PendingUpdate(
98            order_event.extract::<OrderPendingUpdate>(py)?,
99        )),
100        stringify!(OrderRejected) => Ok(OrderEventAny::Rejected(
101            order_event.extract::<OrderRejected>(py)?,
102        )),
103        stringify!(OrderReleased) => Ok(OrderEventAny::Released(
104            order_event.extract::<OrderReleased>(py)?,
105        )),
106        stringify!(OrderSubmitted) => Ok(OrderEventAny::Submitted(
107            order_event.extract::<OrderSubmitted>(py)?,
108        )),
109        stringify!(OrderTriggered) => Ok(OrderEventAny::Triggered(
110            order_event.extract::<OrderTriggered>(py)?,
111        )),
112        stringify!(OrderUpdated) => Ok(OrderEventAny::Updated(
113            order_event.extract::<OrderUpdated>(py)?,
114        )),
115        _ => Err(to_pyvalue_err(
116            "Error in conversion from `PyObject` to `OrderEventAny`",
117        )),
118    }
119}